5 votes

Afficher uniquement un sous-arbre de processus

Je voudrais afficher une liste d'un seul processus et de ses enfants actuels. Donc, étant donné l'arborescence des processus suivante :

Imaginez la liste des 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 juste montrer le processus 1426 et ses enfants. Comme ceci :

  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 le faire ?

8voto

user9517 Points 113163

Vous pouvez utiliser pstree pour cela et obtenir également une sortie joliment formatée

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)

7voto

quanta Points 49664
$ ps -p 1426 --ppid 1426 --forest

ou:

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

pour afficher les détails de la commande.

0voto

ROSE Points 134

Le script suivant affiche tous les processus s'exécutant 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. La variable level est juste au cas où vous avez besoin de déboguer le script. Le = dans ps -o pid= fait en sorte qu'il n'affiche pas d'en-têtes. paste -sd, transforme une liste séparée par des sauts de ligne en une liste séparée par des virgules (-d spécifie le délimiteur, plus d'informations ici). tmux display-message affiche le PID du serveur (-p - vers stdout).

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