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)を持っています。