Bu pstree
çok iyi bir çözüm, ancak biraz suskun. Onun ps --forest
yerine kullanıyorum. Ancak PID
( -p
) için değil, yalnızca belirli bir işlemi basar, ancak oturum için ( -g
). Herhangi bir bilgiyi ps
yazdırabilir ve -o
seçeneği tanımlayan süslü bir ASCII resim ağacında yazdırabilir .
Öyleyse bu sorun için önerim:
ps --forest -o pid,tty,stat,time,cmd -g 2795
Eğer süreç bir oturum lideri değilse, o zaman biraz daha fazla numara uygulanmalıdır:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Bu işlem ilk önce o anki işlemin oturum kimliğini (SID) alır ve ardından bu sid ile tekrar ps çağrısı yapar.
Sütun başlıklarına gerek yoksa, '-o' seçeneklerinde her bir sütun tanımından sonra '=' ekleyin, örneğin:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
Bir örnek çalışma ve sonuç:
$ 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
Ne yazık ki bu, screen
her çocuk perdesi ve tüm torun bash için sid ayarlar olarak işe yaramaz .
Bir sürecin doğduğu tüm süreçleri elde etmek için bütün ağacın yapılması gerekir. Bunun için awk kullandım . İlk başta hepsini içermek için bir karma dizisi oluşturur PID => ,child,child...
. Sonunda, belirli bir sürecin tüm alt süreçlerini çıkarmak için özyinelemeli bir işlev çağırır. Sonuç, ps
formatlamak için sonuç bir başkasına iletilir . Gerçek PID, yerine awk'ye bir argüman olarak yazılmalıdır <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)}')
Bir SCREEN işlemi için (pid = 8041) örnek çıktı şöyle görünür:
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
.