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
输出应该是一样的。
您应该自定义输出格式,以达到您的目标。
我想知道每个进程打开的文件数,所以我使用 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
输出应该是一样的。
您应该自定义输出格式,以达到您的目标。