我在一台机器上运行几个java进程,我想要打开文件的数量以及这些文件的类型的准确计数。
首先,跑步sudo lsof
需要很长时间。
[user@host]:~$ time sudo lsof > lsof.txt
real 1m5.920s
user 0m27.152s
sys 0m38.100s
找出java进程打开的文件数:
[user@host]:~$ grep -e "^java" lsof.txt -c
2565341
这是异常高的。
如果我尝试通过lsof
使用标志过滤输出来获得相同的数字-c
,我会得到一个完全不同的答案,并且lsof
与第一个命令相比花费的时间很少
[user@host]:~$ time sudo lsof -c java | wc -l
4465
real 0m0.139s
user 0m0.052s
sys 0m0.068s
答案1
速度不一致的原因是套接字也是文件,以及其他与网络相关的东西,例如在 NFS 上执行 stat()。您可以运行lsof -b
它将跳过这些操作。
至于行数的差异,那你就得自己检查一下结果了。有时,如果您对结果进行排序然后进行比较,会有所帮助:
sort lsof.txt > lsof-full-sorted.txt
diff lsof-full-sorted.txt lsof-filtered-sorted.txt
(在我的示例中 lsof-filtered-sorted.txt 指的是 的输出lsof -c java|sort
)
此外,午夜指挥官有一个很好的基于 diff 的文件比较功能,它比 diff 输出更容易阅读。