編集:特定のユースケース:すべてのサブアイテムをインポートする

編集:特定のユースケース:すべてのサブアイテムをインポートする

pstree多くのコードやひどい構文解析なしで機械が読み取ることができる機械出力の出力を得るための良い方法はありますか?

私は本当にすべてのサブプロセスのリストが欲しい。

編集:特定のユースケース:すべてのサブアイテムをインポートする

> useful_pstree $PID

1010
1012
10101
1013

より一般的なユースケースでは、美しいJSONを得ることができます。

# json_pstree $PID

 { 'pid': 1010,
       children: { ...

しかし...私は、コマンドラインからjson構造への再帰を簡単に実行する良い方法を知りません(à la jq)。

答え1

ps以下は、引数として提供されたプロセスから始まり、サブプロセスから出力を繰り返し出力するシェルスクリプトです。スクリプトにはエラーチェックがないため、ps必要な出力に応じていくつかのオプションを追加する必要があります。

#!/bin/sh

printps() {
    if [ $# -gt 0 ]
    then
        ps --no-headers $*
        for p in $*; do
            printps $(cat /proc/$p/task/$p/children)
        done
    fi
}

printps $1

答え2

pgrep親PIDによるフィルタリングをサポートするバージョンがある場合は、それを使用してこのリストを取得できます。たとえば、

$ pstree -pa 1058
terminator,1058 /usr/bin/terminator
  ├─sudo,1249 -i
  │   └─zsh,1252
  ├─zsh,1250
  │   └─wget,26232 --continue --input-file=-
  ├─zsh,28482
...

bash 配列 sum を使用してpgrepツリーの幅優先巡回を実行します。

$ pids=( 1058 ); for ((i=0; i < ${#pids[@]}; i++)); do pids+=( $(pgrep -P ${pids[$i]}) ); done; printf "%s\n" "${pids[@]}"
1058
1249
1250
28482
1252
26232
29138
...

使用している項目に応じてを使用または表示することもpsできます/proc

pstree私は機械が読める出力を印刷するオプションがない最新バージョン(GNU、23.1)を持っています。

関連情報