サブプロセスのリストをエレガントにインポートします。

サブプロセスのリストをエレガントにインポートします。

から継承するすべてのプロセス(子、孫など)のリストを取得したいと思います$pid。これが私が思いついた最も簡単な方法です。

pstree -p $pid | tr "\n" " " |sed "s/[^0-9]/ /g" |sed "s/\s\s*/ /g"

完全なリストを取得するコマンドや簡単な方法はありますか?みんな子孫プロセス?

答え1

次のコマンドは少し簡単で、コマンド名の数字を無視できるという利点があります。

pstree -p $pid | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

またはPerlを使用してください。

pstree -p $pid | perl -ne 'print "$1\n" while /\((\d+)\)/g'

私たちはかっこ内の数字を探しているので、それに会ったときにサブプロセスとして2が与えられませんgif2png(3012)。ただし、コマンド名に角かっこを含む数字が含まれていると、すべて失敗します。テキスト処理は多くの役に立ちます。

だから私もプロセスグループが行く道だと思います。プロセスを独自のプロセスグループで実行するには、Debianパッケージ「daemontools」の「pgrphack」ツールを使用できます。

pgrphack my_command args

またはPerlを再利用することもできます:

perl -e 'setpgid or die; exec { $ARGV[0] } @ARGV;' my_command args

ここで注目すべき唯一のことは、プロセスグループが入れ子にならないことです。したがって、プロセスが独自のプロセスグループを作成すると、その子プロセスは作成されたグループに含まれなくなります。

答え2

descendent_pids() {
    pids=$(pgrep -P $1)
    echo $pids
    for pid in $pids; do
        descendent_pids $pid
    done
}

答え3

正確性の問題もある。出力を素早く解析pstreeさまざまな理由で問題があります。

  • pstree ショー PIDそしてスレッドのID(名前は中括弧内に表示されます)
  • コマンド名には中かっこ、括弧内に数字が含まれているため、安定した解析ができない場合があります。

Pythonがありますpsutilパッケージをインストールしたら、このコードスニペットを使用してすべての子プロセスを一覧表示できます。

pid=2235; python3 -c "import psutil
for c in psutil.Process($pid).children(True):
  print(c.pid)"

(たとえば、psutilパッケージはtracerFedora / CentOSで利用可能なコマンドの依存関係としてインストールされます。)

または、Bourne シェルでプロセスツリーの幅優先順位を実行することもできます。

ps=2235; while [ "$ps" ]; do echo $ps; ps=$(echo $ps | xargs -n1 pgrep -P); \
  done | tail -n +2 | tr " " "\n"

pidの転移的閉鎖を計算するには、尾を省略できます。

上記のコードは再帰を使用せず、ksh-88でも実行されます。

Linuxでは、以下を削除できます。pgrep電話して次の情報を読んでください/proc

ps=2235; while [ "$ps" ]; do echo $ps ; \
  ps=$(for p in $ps; do cat /proc/$p/task/$p/children; done); done \
  | tr " " "\n"' | tail -n +2

これは、各PIDの分岐/実行を保存し、各呼び出しpgrepに対して追加の操作を実行するため、より効率的です。

答え4

私が見つけた最も短いバージョンは、次のコマンドも正しく処理しますpop3d

pstree -p $pid | perl -ne 's/\((\d+)\)/print " $1"/ge'

コマンドに次のような奇妙な名前があると、my(23)prog誤って処理されます。

関連情報