53 votes

ps : Comment obtenir récursivement tous les processus enfants pour un pid donné ?

Comment puis-je obtenir l'affichage de toute l'arborescence des processus générés par un processus donné sous forme d'arbre, et uniquement cet arbre, c'est-à-dire aucun autre processus ?

Le résultat pourrait par exemple ressembler à

 4378 ?        Ss     0:10 SCREEN
 4897 pts/16   Ss     0:00  \_ -/bin/bash
25667 pts/16   S+     0:00  |   \_ git diff
25669 pts/16   S+     0:00  |       \_ less -FRSX
11118 pts/32   Ss+    0:00  \_ -/bin/bash
11123 pts/32   S+     0:00      \_ vi

Je n'ai pas pu obtenir le résultat souhaité uniquement avec les paramètres de ps .

La méthode suivante donne le résultat souhaité mais semble un peu compliquée :

#!/bin/bash

pidtree() {
  echo -n $1 " "
  for _child in $(ps -o pid --no-headers --ppid $1); do
    echo -n $_child `pidtree $_child` " "
  done
}

ps f `pidtree 4378`

Quelqu'un a-t-il une solution plus simple ?

0voto

BenTaylor Points 101

Cela permet d'obtenir tous les pid avec les ppid en dernier lieu, les filtres sur ceux qui se terminent par ppid qui nous intéresse, puis sélectionne simplement l'élément pid . Puis se reproduit.

pidtree() {
  echo $1
  for p in $(ps -o pid=,ppid= | grep $1$ | cut -f1 -d' '); do
    pidtree $p
  done
}

pidtree $1

0voto

mug896 Points 131

J'ai écrit ce Shell Shell en me basant sur la réponse de @y_159.

list_descendants ()
{
    local children=$( cat /proc/$1/task/*/children 2> /dev/null )
    for pid in $children
    do
        list_descendants $pid
    done
    echo $children
}

$ PID=`pidof gdm3`

$ ps f $PID $(list_descendants $PID)
    PID TTY      STAT   TIME COMMAND
   1492 ?        Ssl    0:00 /usr/sbin/gdm3
   1498 ?        Sl     0:00  \_ gdm-session-worker [pam/gdm-autologin]
   1531 tty2     Ssl+   0:00      \_ /usr/libexec/gdm-x-session --register-session ...
   1533 tty2     Sl+   27:25          \_ /usr/lib/xorg/Xorg vt2 -displayfd 3 ...
   1640 tty2     Sl+    0:00          \_ /usr/bin/startplasma-x11
   1745 ?        Ss     0:00              \_ /usr/bin/ssh-agent /usr/bin/

Si vous avez besoin d'un code encore plus rapide, alors ...

$ awk -v PPID=`pidof gdm3` -v FPAT='[^ ]+|\\([^\\)]*\\)' '
    { a[$1] = $4 } END{ print PPID; desc(PPID) }
function desc( ppid,   i) {
    for ( i in a ) { if ( a[i] == ppid ) { print i; desc(i) }}
}
' /proc/[1-9]*/stat | xargs ps f
    PID TTY      STAT   TIME COMMAND
   1492 ?        Ssl    0:00 /usr/sbin/gdm3
   1498 ?        Sl     0:00  \_ gdm-session-worker [pam/gdm-autologin]
   1531 tty2     Ssl+   0:00      \_ /usr/libexec/gdm-x-session --register-session ...
   1533 tty2     Sl+   28:21          \_ /usr/lib/xorg/Xorg vt2 -displayfd 3 ...
   1640 tty2     Sl+    0:00          \_ /usr/bin/startplasma-x11
   1745 ?        Ss     0:00              \_ /usr/bin/ssh-agent /usr/bin/im-launch ...

-2voto

Andy Wong Points 101
  • pour tous les processus : pstree -a
  • afficher par l'utilisateur : pstree user

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X