Question Afficher uniquement un sous-arbre de processus


Je voudrais montrer une liste d'un processus unique et ses enfants actuels. Donc, étant donné l’arbre de processus suivant:

Imaginez la liste de processus suivante:

  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:06  \_ [ksoftirqd/0]  
  ...snip...
 1292 ?        Ss     0:06 /usr/sbin/gpm -m /dev/input/mice -t exps2
 1426 ?        Ss     0:00 /usr/lib/postfix/master
 9785 ?        S      0:00  \_ qmgr -l -t fifo -u
12301 ?        S      0:00  \_ pickup -l -t fifo -u -c
 1545 ?        Ss     0:05 /usr/sbin/apache2 -k start
 1570 ?        S      0:00  \_ /usr/sbin/apache2 -k start  
  ...snip...

Je voudrais plutôt montrer simplement le processus 1426 et ses enfants. Comme ça:

  PID TTY      STAT   TIME COMMAND
 1426 ?        Ss     0:00 /usr/lib/postfix/master
 9785 ?        S      0:00  \_ qmgr -l -t fifo -u
12301 ?        S      0:00  \_ pickup -l -t fifo -u -c

Y a-t-il un moyen simple de faire cela?


4
2017-09-17 05:35


origine




Réponses:


Vous pouvez utiliser pstree faire cela et obtenir une sortie bien formatée aussi

pstree -p 22221
mysqld_safe(22221)─┬─logger(22334)
                   └─mysqld(22332)─┬─{mysqld}(22335)
                                   ├─{mysqld}(22336)
                                   ├─{mysqld}(22337)
                                   ├─{mysqld}(22338)
                                   ├─{mysqld}(22340)
                                   ├─{mysqld}(22341)
                                   ├─{mysqld}(22342)
                                   ├─{mysqld}(22343)
                                   ├─{mysqld}(22346)
                                   └─{mysqld}(22394)

8
2017-09-17 05:46





$ ps -p 1426 --ppid 1426 --forest

ou:

$ ps -eo pid,ppid,tty,stat,time,command --forest | awk '$1 == 1426 || $2 == 1426'

pour afficher la commande de détails.


7
2018-05-28 14:51





Le script suivant affiche tous les processus en cours d'exécution sous tmux:

#!/usr/bin/env bash
set -eu

my_pid=$$
subtree_pids() {
    local pid=$1 level=${2:-0}
    if [ "$pid" = "$my_pid" ]; then
        return
    fi
    echo "$pid"
    ps --ppid "$pid" -o pid= | while read -r pid; do
        subtree_pids "$pid" $((level + 1))
    done
}

server_pid=$(tmux display-message -pF '#{pid}')
ps -p "$(subtree_pids "$server_pid" | paste -sd,)" -Ho pid,ppid,comm,args

La sortie ressemble à ceci:

 7170     1   tmux: server    tmux -f /home/yuri/.tmux-windows at
 7171  7170     bash            bash --rcfile /dev/fd/63 -i
 7182  7171       vim             vim ...
 7173  7170     bash            bash --rcfile /dev/fd/63 -i
 7183  7173       vim             vim ...

Pour cela, il appelle récursivement ps --ppid .... my_pid stocke le PID du script lui-même pour éviter une récursion infinie. level variable est juste au cas où vous auriez besoin de déboguer le script. = dans ps -o pid= permet de ne pas afficher les en-têtes. paste -sd, transforme la liste séparée par une nouvelle ligne en une liste séparée par des virgules (-d spécifie le délimiteur, plus à ce sujet ici). tmux display-message affiche le PID du serveur (-p - à la sortie).


0