Ini pstree
adalah solusi yang sangat bagus, tetapi agak pendiam. Saya menggunakan ps --forest
sebagai gantinya. Tetapi tidak untuk a PID
( -p
) karena hanya mencetak proses spesifik, tetapi untuk sesi ( -g
). Ia dapat mencetak informasi apa pun yang ps
dapat dicetak dalam pohon seni ASCII yang mewah yang menentukan -o
opsi.
Jadi saran saya untuk masalah ini:
ps --forest -o pid,tty,stat,time,cmd -g 2795
Jika prosesnya bukan pemimpin sesi, maka sedikit trik yang harus diterapkan:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Ini mendapatkan id sesi (SID) dari proses saat ini terlebih dahulu dan kemudian memanggil ps lagi dengan sisi itu.
Jika tajuk kolom tidak diperlukan, tambahkan '=' setelah setiap definisi kolom dalam opsi '-o', seperti:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
Contoh dijalankan dan hasilnya:
$ 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
Sayangnya ini tidak berfungsi karena screen
mengatur sid untuk setiap layar anak dan semua cucu bash.
Untuk mendapatkan semua proses yang dihasilkan oleh suatu proses, seluruh pohon perlu dibangun. Saya menggunakan awk untuk itu. Pada awalnya ia membangun array hash untuk mengandung semua PID => ,child,child...
. Pada akhirnya ia memanggil fungsi rekursif untuk mengekstrak semua proses anak dari proses yang diberikan. Hasilnya diteruskan ke yang lain ps
untuk memformat hasilnya. PID yang sebenarnya harus ditulis sebagai argumen untuk awk alih-alih <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)}')
Untuk proses SCREEN (pid = 8041) contoh output terlihat seperti ini:
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
.