lsofを使用して親プロセスとその子プロセスが開いたすべてのファイルを一覧表示するにはどうすればよいですか?

lsofを使用して親プロセスとその子プロセスが開いたすべてのファイルを一覧表示するにはどうすればよいですか?
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, -)"

おすすめ記事