Das pstree
ist eine sehr gute Lösung, aber es ist ein bisschen zurückhaltend. Ich benutze ps --forest
stattdessen. Aber nicht für a PID
( -p
), weil es nur den spezifischen Prozess ausgibt, sondern für die session ( -g
). Es kann alle Informationen ps
ausdrucken, die in einem ausgefallenen ASCII-Kunstbaum gedruckt werden können, der die -o
Option definiert.
Also mein Vorschlag für dieses Problem:
ps --forest -o pid,tty,stat,time,cmd -g 2795
Wenn der Prozess kein Sitzungsleiter ist, muss ein kleiner Trick angewendet werden:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Dies ruft zuerst die Sitzungs-ID (SID) des aktuellen Prozesses ab und ruft dann mit dieser Seite erneut ps auf.
Wenn die Spaltenüberschriften nicht benötigt werden, fügen Sie nach jeder Spaltendefinition ein '=' in die Optionen '-o' ein, wie zum Beispiel:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
Ein Beispiellauf und das Ergebnis:
$ 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
Leider funktioniert dies nicht, screen
da es die Seite für jeden untergeordneten Bildschirm und alle Enkelkind-Bash festlegt.
Damit alle Prozesse von einem Prozess erzeugt werden, muss der gesamte Baum erstellt werden. Ich habe awk dafür benutzt. Zunächst wird ein Hash-Array erstellt, das alle Elemente enthält PID => ,child,child...
. Am Ende wird eine rekursive Funktion aufgerufen, um alle untergeordneten Prozesse eines bestimmten Prozesses zu extrahieren. Das Ergebnis wird an einen anderen übergeben, ps
um das Ergebnis zu formatieren. Die tatsächliche PID muss als Argument für awk geschrieben werden, anstatt <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)}')
Für einen SCREEN-Prozess (pid = 8041) sieht die Beispielausgabe folgendermaßen aus:
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
.