これpstree
は非常に良いソリューションですが、少し控えめです。ps --forest
代わりに使用します。ただし、特定のプロセスのみを出力するため、PID
(-p
)ではなく、セッション(-g
)についてです。オプションをps
定義する豪華なASCIIアートツリーで印刷できる情報を印刷でき-o
ます。
したがって、この問題に対する私の提案:
ps --forest -o pid,tty,stat,time,cmd -g 2795
プロセスがセッションリーダーでない場合、もう少しトリックを適用する必要があります。
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
これは、最初に現在のプロセスのセッションID(SID)を取得してから、そのsidで再度psを呼び出します。
列ヘッダーが不要な場合、「-o」オプションの各列定義の後に「=」を追加します。
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
実行例と結果:
$ ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 30085)
27950 pts/36 Ss 00:00:00 -bash
30085 pts/36 S+ 00:00:00 \_ /bin/bash ./loop.sh
31888 pts/36 S+ 00:00:00 \_ sleep 5
残念ながら、screen
各子画面とすべての孫bashにsidを設定するため、これは機能しません。
プロセスによって生成されるすべてのプロセスを取得するには、ツリー全体を構築する必要があります。そのためにawkを使用しました。最初に、allを含むハッシュ配列を作成しますPID => ,child,child...
。最後に、再帰関数を呼び出して、特定のプロセスのすべての子プロセスを抽出します。結果は別の結果に渡されps
、結果がフォーマットされます。実際のPIDは、次の代わりにawkの引数として記述する必要があります<PID>
。
ps --forest $(ps -e --no-header -o pid,ppid|awk -vp=<PID> 'function r(s){print s;s=a[s];while(s){sub(",","",s);t=s;sub(",.*","",t);sub("[0-9]+","",s);r(t)}}{a[$2]=a[$2]","$1}END{r(p)}')
SCREENプロセス(pid = 8041)の場合、出力例は次のようになります。
PID TTY STAT TIME COMMAND
8041 ? Ss 0:00 SCREEN
8042 pts/8 Ss 0:00 \_ /bin/bash
8092 pts/8 T 0:00 \_ vim test_arg test_server
12473 pts/8 T 0:00 \_ vim
12972 pts/8 T 0:00 \_ vim
ps auxf
ます。