lsof 打开的文件数不一样

lsof open files count not same

我想知道每个进程打开的文件数,所以我使用 lsof 命令:

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

我发现一个 pid "934" 的进程打开了 11374 个文件但是当我使用

lsof -p 934 | wc -l 

有线结果显示只打开了122个文件

下图显示了我使用的命令。

lsof -n | awk '{Count[]++} END{asorti( Count, PIDs);for( pid in PIDs) print pid "\t" PIDs[pid]}'

试试这个,避免几个子 shell 并且只在你的 lsof 后面 1 awk

对于非 gnu sed(其中缺少 asorti

lsof -n | awk '{Count[]++} END{for( pid in Count) print pid "\t" Count[pid]}' | sort

为什么两个计数不同?

理由一:

lsof生成一个header,在你的lsof -p xxx里算了,但是在你的awk过滤里,过滤掉了(header没有==pid) ,因此计数必须不同。然而我们看到差异是 >>1,所以原因二。

原因二:(主要原因)

lsof 将默认始终输出线程 ID(TID 阅读手册页了解详细信息)。但是,如果您添加 -p xxx,则仅列出进程打开的文件,而不会列出 TID。

如果你想证明它,试试这两行:

lsof -p somePid|wc -l

lsof|awk '==somePid||NR==1'|wc -l

输出应该是一样的。

您应该自定义输出格式,以达到您的目标。