2012-09-17 20 views
11

我有一个在服务器上运行的进程的30个实例,并且想记录每个进程的打开文件以进行分析。lsof应该为一组pid提供所有打开的文件

我运行以下命令:

* ps auwwx | grep PROG_NAME | awk '{print $2}' | xargs lsof -p | less 

它抱怨,“lsof的:对状态错误:没有这样的文件或目录”

但是,如果我跑lsof -p <pid>它给了我该进程的打开文件列表。如何获得FreeBSD机器上所有30个进程实例的所有打开文件的列表。

此外,我不希望共享库被列出。如果我做-d "^txt"它不显示我想要显示的其他数据库文件。有没有其他的方法来清理.so文件?

+0

FYI:我想解决类似的问题 - 计数打开的文件数每个进程,特别是Java。我这样做了:'pgrep java | xargs -I {} bash -c'printf {}; lsof -p {} | wc -l'' –

回答

14

lsof -p选项采用逗号分隔的PID列表。你使用xargs的方式将把pid作为单独的参数传递,导致一些被解释为文件名。

尝试lsof -p $(your grep | tr '\012' ,)这将有一个尾随逗号,我不确定lsof是否会在意,但如果有必要您可以将sed关闭。

5

您可以使用xargs -L1 lsof -p每个pid运行lsof一次。

更妙的是:使用lsof -c从匹配特定样式的命令列出所有打开的文件:对互联网路人

lsof -c bas # list all processes with commands starting with 'bas' 
lsof -c '/ash$/x' # list all commands ending with 'ash' (regexp syntax) 
相关问题