Exibe apenas uma subárvore de processo

4

Eu gostaria de mostrar uma listagem de um único processo e seus filhos atuais. Então, dada a seguinte árvore de processos:

Imagine a seguinte listagem de processos:

  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...

Eu gostaria de mostrar apenas o processo 1426 e seus filhos. Assim:

  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

Existe uma maneira simples de fazer isso?

    
por tylerl 17.09.2011 / 07:35

3 respostas

8

Você pode usar o pstree para fazer isso e obter uma saída bem formatada também

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)
    
por 17.09.2011 / 11:00
7
$ ps -p 1426 --ppid 1426 --forest

ou:

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

para exibir o comando detalhes.

    
por 17.09.2011 / 07:46
0

O script a seguir exibe todos os processos em execução em 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

A saída é assim:

 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 ...

Para isso, chama recursivamente ps --ppid ... . my_pid armazena o PID do próprio script, para evitar a recursão infinita. A variável level é apenas para o caso de você precisar depurar o script. = in ps -o pid= faz com que não exiba cabeçalhos. paste -sd, transforma a lista separada por nova linha em uma separada por vírgula ( -d especifica o delimitador, mais sobre aqui ). tmux display-message exibe o PID do servidor ( -p - para stdout).

    
por 28.05.2018 / 16:51