13

我有 30 个在服务器上运行的进程实例,并希望记录每个进程的打开文件以进行分析。

我运行了以下命令:

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

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

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

此外,我不希望列出共享库。如果我这样做-d "^txt",它不会显示我想要显示的其他一些数据库文件。有没有其他方法可以 grep 出 .so 文件?

4

2 回答 2

18

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

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

于 2012-09-18T00:18:17.757 回答
5

您可以使用每个 pidxargs -L1 lsof -p运行一次。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)
于 2012-09-18T00:19:13.817 回答