13

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

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

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

「lsof:ステータスエラー:そのようなファイルまたはディレクトリはありません」と文句を言います。

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

さらに、共有ライブラリをリストしたくありません。私がそうするならば、-d "^txt"それは私が見せたい他のいくつかのdbファイルを見せていません。.soファイルをgrepする他の方法はありますか?

4

2 に答える 2

18

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

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

于 2012-09-18T00:18:17.757 に答える
5

pidごとに1回xargs -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 に答える