
lsof -p PID
これは、単一のプロセスで開かれているすべてのファイルを一覧表示するのにはうまく機能しますが、特定の基本プロセスとその子プロセスで現在開いているすべてのファイルを一覧表示する必要があります。これを行う最良の方法は何ですか?これが不可能な場合は、lsof
これを達成するためにどのような他の方法を使用できますか?
答え1
(直系)サブアイテムに対して$pid
次のことができます。
lsof -p "$({ echo "$pid"; pgrep -P "$pid"; } | paste -sd , -)"
pgrep
, like は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, -)"
答え2
セミハンドメイドファッション:
$ pstree -p PID
上からPIDを集める
$ lsof -p pid1,pid2,pid3,...
または、出力がps --ppid 1413 -o pid=
空になるまで繰り返してpidリストを収集します。
答え3
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | grep PARENT_PID
lsofは、親プロセスと子プロセスのオープンファイルを一覧表示できるためです。 2番目の列の出力は親プロセスです。