È pstree
un'ottima soluzione, ma è un po 'reticente. Io uso ps --forest
invece. Ma non per un PID
( -p
) perché stampa solo il processo specifico, ma per la sessione ( -g
). Può stampare qualsiasi informazione ps
possa essere stampata in un albero di fantasia in ASCII che definisce l' -o
opzione.
Quindi il mio suggerimento per questo problema:
ps --forest -o pid,tty,stat,time,cmd -g 2795
Se il processo non è un leader di sessione, è necessario applicare un altro trucco:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Questo ottiene prima l'ID sessione (SID) del processo corrente e quindi chiama di nuovo ps con quel sid.
Se le intestazioni di colonna non sono necessarie aggiungere un '=' dopo ogni definizione di colonna nelle opzioni '-o', come:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
Una corsa di esempio e il risultato:
$ 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
Sfortunatamente questo non funziona screen
perché imposta il sid per ogni schermata figlio e per tutti i nipoti bash.
Per ottenere tutti i processi generati da un processo, è necessario costruire l'intero albero. Ho usato awk per quello. Inizialmente crea un array di hash per contenere tutto PID => ,child,child...
. Alla fine chiama una funzione ricorsiva per estrarre tutti i processi figlio di un dato processo. Il risultato viene passato a un altro ps
per formattare il risultato. Il PID effettivo deve essere scritto come argomento per awk anziché <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)}')
Per un processo SCREEN (pid = 8041) l'output di esempio è simile al seguente:
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
.