C'est pstree
une très bonne solution, mais c'est un peu réticent. Je l'utilise ps --forest
plutôt. Mais pas pour a PID
( -p
) car il affiche uniquement le processus spécifique, mais pour la session ( -g
). Il peut imprimer n'importe quelle information ps
peut être imprimé dans une arborescence de fantaisie ASCII définissant l' -o
option.
Donc ma suggestion pour ce problème:
ps --forest -o pid,tty,stat,time,cmd -g 2795
Si le processus n'est pas un chef de session, un truc un peu plus doit être appliqué:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Cela récupère d'abord l'identifiant de session (SID) du processus en cours, puis appelle à nouveau ps avec ce sid.
Si les en-têtes de colonne ne sont pas nécessaires, ajoutez un '=' après chaque définition de colonne dans les options '-o', comme suit:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
Un exemple d'exécution et le résultat:
$ 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
Malheureusement, cela ne fonctionne pas screen
car il définit le sid pour chaque écran enfant et tous les bash enfants.
Pour obtenir tous les processus engendrés par un processus, il faut construire l'arbre entier. J'ai utilisé awk pour ça. Au début, il construit un tableau de hachage pour tout contenir PID => ,child,child...
. À la fin, il appelle une fonction récursive pour extraire tous les processus enfants d'un processus donné. Le résultat est passé à un autre ps
pour formater le résultat. Le PID réel doit être écrit comme argument pour awk au lieu de <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)}')
Pour un processus SCREEN (pid = 8041), l'exemple de sortie ressemble à ceci:
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
.