2012-09-17 19 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) 
相關問題