web-dev-qa-db-ja.com

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

lsof -p PID

単一のプロセスで開いているすべてのファイルを一覧表示することはできますが、特定のマスタープロセスとその子プロセスで現在開いているすべてのファイルを一覧表示する必要があります。これを行うための最良の方法は何ですか? lsofでこれが不可能な場合、他にどのような方法でこれを実現できますか?

2
Jeff S

のために $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, -)"
1

セミマニュアルファッション:

$ pstree -p PID

上記からPIDを収集します

$ lsof -p pid1,pid2,pid3,...

または、pidのリストを収集するために、ps --ppid 1413 -o pid=の出力を空になるまでループします。

0
Jeff Schaller