如何显示打开的文件描述符,但不使用lsof命令


48

嗨,我已经读过这里,lsof并不是获取当前打开的文件描述符数量的准确方法。他建议改用此命令

 cat /proc/sys/fs/file-nr

当此命令显示FD的数量时,如何显示上面命令刚刚计算的打开文件描述符列表?


4
您可能想知道是否超过了您的ulimit,对吗?我在linuxintro.org/wiki/Is_my_ulimit_exceeded写了关于这个的博客;最重要的是,ulimit是每个进程的限制,您可以在/ proc / PID / limits下找到它,而不是lsof,我将使用ls / proc / PID / fd列出该进程的文件描述符。
托尔斯滕·斯塔克

Answers:


60

有两个原因lsof | wc -l不计算文件描述符。其一是它列出了不是打开文件的内容,例如加载的动态链接库和当前工作目录。您需要将它们过滤掉。另一个是lsof运行需要一些时间,因此可能会丢失运行时打开或关闭的文件。因此,列出的打开文件数是近似值。查看/proc/sys/fs/file-nr为您提供了在特定时间点的准确值。

cat /proc/sys/fs/file-nr仅在需要确切数字时才有用,主要用于检查资源是否耗尽。如果要列出打开的文件,则需要调用lsof,或使用一些等效的方法,例如/proc/*/fd手动拖网。


1
嗨,谢谢您对吉尔斯的良好解释。我尝试了ls / proc / * / fd并获得了当时所有打开的fd。它产生带有一些颜色编码的输出,我只需要看一下手册。
dimas

@dimas /proc/*/fd目录包含指向打开文件的符号链接。为了进行外观检查,请使用ls -l。对于自动处理,用于readlink提取链接目标。
吉尔斯(Gilles)'所以别再邪恶了'

只需使用ls -l,但我将尝试使用readlink。我尝试了此处指定的其他/ proc / PID / maps和其他选项kernel.org/doc/man-pages/online/pages/man5/proc.5.html。再次感谢您提供其他信息。
dimas

1
/ proc / sys / fs / file-nr给我3872(和另外两个数字)。如果ulimit -n向我显示1024,如何计算打开的文件数?
Thorsten Staerk

1
@ThorstenStaerk setrlimitulimitshell命令基础的系统调用)的所有设置都是按进程进行的。它们仅影响进行调用的过程(并间接影响以后分叉的过程)。
吉尔斯(Gilles)'所以

25

进程信息由系统动态保存在/ proc下的目录中。例如,使用PID 1234的进程将具有一个名为/ proc / 1234的目录。

那里有很多信息,但是现在您对/ proc / 1234 / fd子目录感兴趣。

注意:您需要具有root权限才能查看或打开您不拥有的进程以及SetUID进程的文件。

例:

root@johan-HP-ProBook-6560b-LG654EA-ACQ:/proc# ls -l 2443/fd
total 0
lr-x------ 1 johan johan 64 Feb 27 10:26 0 -> pipe:[13637]
l-wx------ 1 johan johan 64 Feb 27 10:26 1 -> /home/johan/.xsession-errors
lrwx------ 1 johan johan 64 Feb 27 10:26 10 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 11 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 12 -> socket:[39495]
lrwx------ 1 johan johan 64 Feb 27 10:26 13 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 14 -> anon_inode:inotify
lrwx------ 1 johan johan 64 Feb 27 10:26 15 -> anon_inode:[eventfd]
l-wx------ 1 johan johan 64 Feb 27 10:26 16 -> pipe:[37885]
lr-x------ 1 johan johan 64 Feb 27 10:26 17 -> pipe:[37886]
l-wx------ 1 johan johan 64 Feb 27 10:26 2 -> /home/johan/.xsession-errors
l-wx------ 1 johan johan 64 Feb 27 10:26 21 -> pipe:[167984]
lr-x------ 1 johan johan 64 Feb 27 10:26 22 -> pipe:[167985]
l-wx------ 1 johan johan 64 Feb 27 10:26 23 -> pipe:[170009]
lr-x------ 1 johan johan 64 Feb 27 10:26 24 -> pipe:[170010]
lrwx------ 1 johan johan 64 Feb 27 10:26 3 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 4 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 5 -> socket:[14721]
l-wx------ 1 johan johan 64 Feb 27 10:26 6 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 7 -> socket:[14730]
lrwx------ 1 johan johan 64 Feb 27 10:26 8 -> socket:[13984]
lrwx------ 1 johan johan 64 Feb 27 10:26 9 -> socket:[14767]

root@johan-HP:/proc# cat 2443/fdinfo/2
pos:    1244446
flags:  0102001

还可以查看/ proc下的其余文件...系统中的许多有用信息都位于此处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.