Le pstree
est une très bonne solution, mais elle est un peu réticente. J'utilise ps --forest
au lieu de cela. Mais pas pour un PID
( -p
) parce qu'il n'imprime que le processus spécifique, mais pour la session ( -g
). Il peut imprimer n'importe quelle information ps
peut être imprimée dans un arbre ASCII fantaisiste définissant les -o
option.
Voici donc ma suggestion pour résoudre ce problème :
ps --forest -o pid,tty,stat,time,cmd -g 2795
Si le processus n'est pas un chef de session, il faut faire preuve d'un peu plus de doigté :
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Il récupère d'abord l'identifiant de session (SID) du processus en cours, puis appelle à nouveau ps avec cet identifiant.
Si les en-têtes de colonnes ne sont pas nécessaires, ajoutez un '=' après chaque définition de colonne dans les options '-o', comme par exemple :
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 pour screen
car il définit le sid pour chaque écran enfant et pour tous les bash petits-enfants.
Pour obtenir tous les processus engendrés par un processus, l'arbre entier doit être construit. J'ai utilisé awk pour cela. Dans un premier temps, il construit un tableau de hachage contenant tous les 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 transmis à une autre fonction ps
pour formater le résultat. Le PID réel doit être écrit en tant qu'argument de la commande 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