使用选项时lsof“谎言”?

时间:2017-06-26 08:58:58

标签: linux lsof

我遇到的问题是我的Java应用程序打开了太多文件。调试这个问题,我依赖于使用lsof。 然而,以这种方式运行lsof需要花费太多时间(超过一分钟):

lsof |grep "java" 

我应该可以使用-p选项运行它,但它“谎言”。它显示的线条太少。

lsof -p <PID of the java process>

这是我的证据:

lsof |grep java  | wc -l 
1510146

lsof -p 802 | wc -l
4735

如果我使用-u选项限制用户名(进程所有者),也会发生同样的情况。

我的系统是: Linux 3.16.0-4-amd64#1 SMP Debian 3.16.39-1 + deb8u2(2017-03-07)x86_64 GNU / Linux

我错过了什么吗?有没有替代使用lsof?

3 个答案:

答案 0 :(得分:1)

lsof不是说谎。 命令的输出:

lsof |grep java  | wc -l 

可能包含其他程序打开的文件或进程的结果。

您要搜索的结果是命令的结果:

lsof -p <PID> | wc -l

您可以为运行java应用程序的用户增加打开文件的限制,在/etc/security/limits.conf中添加以下行:

<USER>   hard   nofile  65536

您可以输入以下内容查看当前用户的限制:

su - <USER>
ulimit -a 

答案 1 :(得分:0)

lsof(不带参数)列出所有打开的文件,包括不使用文件描述符的文件,例如当前工作目录,内存映射的库文件和可执行文本文件。

lsof -p <PID>列出打开的文件描述符。文件描述符是程序用来获取文件句柄的数据结构,最常见的是标准输入,标准输出和标准错误为0,1,2。

请参阅:https://www.netadmintools.com/art295.html

答案 2 :(得分:0)

根据我的观察,似乎

lsof | grep <pid> | wc -l 

将给出重复计数,因为指定进程中的每个线程都会添加一行,例如如果您的进程有 8 个线程,则结果将是实际文件数的 8 倍以上。

另一方面,

lsof -p <PID> | wc -l

产生更精确的结果,因为每个文件只计算(打印)一次。

虽然我还没有找到这个问题的官方参考。