サーバーで実行されているプロセスの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する他の方法はありますか?
lsof -p
オプションは、PIDのコンマ区切りのリストを取ります。 xargs
の使用方法は、pidを個別の引数として渡し、一部をファイル名として解釈するように導きます。
lsof -p $(your grep | tr '\012' ,)
を試してください。末尾にコンマが付きます。lsof
が気になるかどうかはわかりませんが、必要に応じてsed
をオフにすることができます。
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)