web-dev-qa-db-ja.com

lsofは、pidのセットに対して開いているすべてのファイルを提供する必要があります

サーバーで実行されているプロセスの30のインスタンスがあり、各プロセスの開いているファイルをログに記録して分析したいと考えています。

次のコマンドを実行しました。

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

"lsof:status error on:No such file or directory"

ただし、lsof -p < pid >そのプロセスで開いているファイルのリストが表示されます。 FreeBSDマシンでプロセスの30のインスタンスすべてについて開いているすべてのファイルのリストを取得するにはどうすればよいですか。

さらに、共有ライブラリをリストに含めたくありません。私が行った場合 -d "^txt"表示したい他のdbファイルが表示されていません。 .soファイルをgrepする他の方法はありますか?

13
user1071840

lsof -pオプションは、PIDのコンマ区切りのリストを取ります。 xargsの使用方法は、pidを個別の引数として渡し、一部をファイル名として解釈するように導きます。

lsof -p $(your grep | tr '\012' ,)を試してください。末尾にコンマが付きます。lsofが気になるかどうかはわかりませんが、必要に応じてsedをオフにすることができます。

18
Ben Jackson

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)
5
nneonneo