【问题标题】:how to find out open file description for linux process?如何找出linux进程的打开文件描述?
【发布时间】:2018-05-30 07:03:02
【问题描述】:

在运行我的go程序时,我在日志中发现了很多错误,例如“打开的文件太多”,我只是想找出哪个进程用完了fds,然后我运行了这个命令:

lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr

返回结果如

279605 20341 62748 19861 10310 19712 5434 21318 3484 27344 2842 19781 2400 20372 2346 24153 2123 5214 1540 21123

pid 为 20341 的进程是 mongod 进程,对此我感到很惊讶。所以我尝试了另一种方式:

lsof -p 20341 | wc -l

但让我烦恼的是它的结果是:567

然后,我尝试另一种方式:ll /proc/20341/fd | wc -l 结果是 496

我现在很困惑,哪个是对的,它们之间有什么不同?

谢谢。


更新于:2018-05-31 10:35:33

  • 获取 mongodb PID [root@node26 10:34:54 ~]$ps aux | grep mongo mongodb 20341 2.4 1.9 25419812 1257420 ? Sl May28 107:58 /usr/bin/mongod --quiet -f /etc/mongod.conf run

  • 命令lsof -p [root@node26 10:36:12 ~]$lsof -p 20341 | wc -l 570

  • 目录 [root@node26 10:36:33 ~]$ll /proc/20341/fd/ | wc -l 499

  • 命令lsof + grep [root@node26 10:37:33 ~]$lsof | grep 20341 | wc -l 282223

    • 前10 mongod 20341 mongodb cwd DIR 9,127 4096 2 / mongod 20341 mongodb rtd DIR 9,127 4096 2 / mongod 20341 mongodb txt REG 9,127 12238320 2499177 /usr/bin/mongod mongod 20341 mongodb mem REG 9,127 67108864 1969114 /var/lib/mongodb/a_dev.0 mongod 20341 mongodb mem REG 9,127 536870912 1968852 /var/lib/mongodb/a_dev.ns mongod 20341 mongodb mem REG 9,127 67108864 1968447 /var/lib/mongodb/a.0 mongod 20341 mongodb mem REG 9,127 536870912 1968347 /var/lib/mongodb/a.ns mongod 20341 mongodb mem REG 9,127 67108864 1968453 /var/lib/mongodb/b.0 mongod 20341 mongodb mem REG 9,127 536870912 1968449 /var/lib/mongodb/b.ns mongod 20341 mongodb mem REG 9,127 67108864 1968590 /var/lib/mongodb/c.0
    • 中间10 mongod 20341 27018 mongodb 490u IPv4 143223380 0t0 TCP node26:27017->node24:59172 (ESTABLISHED) mongod 20341 27018 mongodb 491u IPv4 143758325 0t0 TCP node26:27017->node25:43016 (ESTABLISHED) mongod 20341 27018 mongodb 492u IPv4 143762443 0t0 TCP node26:27017->node24:60602 (ESTABLISHED) mongod 20341 27018 mongodb 493u IPv4 154865226 0t0 TCP node26:27017->node26:54800 (ESTABLISHED) mongod 20341 27018 mongodb 494u IPv4 164046515 0t0 TCP node26:27017->node24:42952 (ESTABLISHED) mongod 20341 27018 mongodb 495u IPv4 164046516 0t0 TCP node26:27017->node24:42960 (ESTABLISHED) mongod 20341 27018 mongodb 497u IPv4 154865844 0t0 TCP node26:27017->node25:41976 (ESTABLISHED) mongod 20341 27018 mongodb 500u IPv4 164046517 0t0 TCP node26:27017->node24:42968 (ESTABLISHED) mongod 20341 27018 mongodb 502u IPv4 164046518 0t0 TCP node26:27017->node26:60306 (ESTABLISHED) mongod 20341 27018 mongodb 503u IPv4 164046519 0t0 TCP node26:27017->node26:60314 (ESTABLISHED)
    • 尾10 mongod 20341 32608 mongodb 492u IPv4 143762443 0t0 TCP node26:27017->node24:60602 (ESTABLISHED) mongod 20341 32608 mongodb 493u IPv4 154865226 0t0 TCP node26:27017->node26:54800 (ESTABLISHED) mongod 20341 32608 mongodb 494u IPv4 164046515 0t0 TCP node26:27017->node24:42952 (ESTABLISHED) mongod 20341 32608 mongodb 495u IPv4 164046516 0t0 TCP node26:27017->node24:42960 (ESTABLISHED) mongod 20341 32608 mongodb 497u IPv4 154865844 0t0 TCP node26:27017->node25:41976 (ESTABLISHED) mongod 20341 32608 mongodb 500u IPv4 164046517 0t0 TCP node26:27017->node24:42968 (ESTABLISHED) mongod 20341 32608 mongodb 502u IPv4 164046518 0t0 TCP node26:27017->node26:60306 (ESTABLISHED) mongod 20341 32608 mongodb 503u IPv4 164046519 0t0 TCP node26:27017->node26:60314 (ESTABLISHED) mongod 20341 32608 mongodb 505u IPv4 164046523 0t0 TCP node26:27017->node26:60322 (ESTABLISHED) mongod 20341 32608 mongodb 730u IPv4 117137926 0t0 TCP node26:27017->node25:54730 (ESTABLISHED)

【问题讨论】:

    标签: linux shell centos lsof


    【解决方案1】:

    /proc/${pid}/fd 包含连接到 shell 的文件描述符,在 lsof 中显示为一个数字,后跟一个 u

    $ la /proc/$$/fd
    total 0
    lrwx------ 1 username users 64 May 30 20:08 0 -> /dev/pts/0
    lrwx------ 1 username users 64 May 30 20:08 1 -> /dev/pts/0
    lrwx------ 1 username users 64 May 30 20:08 2 -> /dev/pts/0
    lrwx------ 1 username users 64 May 30 20:08 255 -> /dev/pts/0
    $ lsof -p $$
    COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
    bash    3720 username  cwd    DIR  254,3    12288 1835009 /home/username
    bash    3720 username  rtd    DIR  254,2     4096       2 /
    bash    3720 username  txt    REG  254,2   859688 2890163 /usr/bin/bash
    bash    3720 username  mem    REG  254,2    46912 2885785 /usr/lib/libnss_files-2.27.so
    bash    3720 username  mem    REG  254,2  2942480 2930144 /usr/lib/locale/locale-archive
    bash    3720 username  mem    REG  254,2   457800 2890072 /usr/lib/libncursesw.so.6.1
    bash    3720 username  mem    REG  254,2  2105608 2885835 /usr/lib/libc-2.27.so
    bash    3720 username  mem    REG  254,2    14144 2885777 /usr/lib/libdl-2.27.so
    bash    3720 username  mem    REG  254,2   363064 2890132 /usr/lib/libreadline.so.7.0
    bash    3720 username  mem    REG  254,2   177680 2885836 /usr/lib/ld-2.27.so
    bash    3720 username    0u   CHR  136,0      0t0       3 /dev/pts/0
    bash    3720 username    1u   CHR  136,0      0t0       3 /dev/pts/0
    bash    3720 username    2u   CHR  136,0      0t0       3 /dev/pts/0
    bash    3720 username  255u   CHR  136,0      0t0       3 /dev/pts/0
    

    它们都是“正确的”,但来自lsof 的计数与用完打开文件有关。

    要查找相关的打开文件限制,请使用ulimit -n

    【讨论】:

    • 好吧。。。为什么lsof | grep <pid>lsof -p <pid>不同?
    • 因为lsof | grep $pid 在大量输出中查找字符串anywhere,而该字符串可能恰好在许多其他地方包含该数字。
    • 我不认为这是原因,因为我得到了 lsof | 的结果grep 并观察结果,它们确实与 相关,而不是其他进程打开的 fd。
    • 没有看到输出,我无法判断问题所在。您可以将差异粘贴到您的问题中吗?
    • thks l0b0,我只是附加了我的环境的结果。
    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多