lsof -p PID
単一のプロセスで開いているすべてのファイルを一覧表示することはできますが、特定のマスタープロセスとその子プロセスで現在開いているすべてのファイルを一覧表示する必要があります。これを行うための最良の方法は何ですか? lsof
でこれが不可能な場合、他にどのような方法でこれを実現できますか?
のために $pid
とその(直接の)子、次のことができます。
lsof -p "$({ echo "$pid"; pgrep -P "$pid"; } | paste -sd , -)"
pgrep
のように、lsof
は標準コマンドではありませんが、最近ではかなりの数のシステムで使用されています。
すべての子孫(子、孫など)について、pstree
を使用してpidのリストを取得できますが、出力を確実に解析できないため、これは絶対確実ではありません。次のようなヘルパー関数を使用できます。
descendants() {
ps -Ao pid= -o ppid= | PID=$1 Perl -lae '
Push @{$children{$F[1]}}, $F[0];
sub tree {
my @pids=($_[0]);
Push @pids, tree($_) for @{$children{$_[0]}};
return @pids;
}
END{print for tree $ENV{PID}}'
}
そして、電話してください:
lsof -p "$(descendants "$pid" | paste -sd, -)"
セミマニュアルファッション:
$ pstree -p PID
上記からPIDを収集します
$ lsof -p pid1,pid2,pid3,...
または、pidのリストを収集するために、ps --ppid 1413 -o pid=
の出力を空になるまでループします。