Como posso mostrar a árvore de processo de um shell de terminal, incluindo filhos?

30

Quando um script é iniciado a partir do prompt de comando, o shell gera um subprocesso para esse script. Quero mostrar essa relação entre o processo no nível do terminal e seus filhos usando psuma saída no estilo de árvore.
Como posso fazer isso?

O que eu tentei até agora

Arquivo: script.sh

#!/bin/bash

ps -f -p$1

Então invoco o script a partir da linha de comando, passando o ID do processo do shell do terminal:

$ ./script.sh $$

O que eu quero é algo como isto

  • processo de shell de nível superior (terminal)
  • ./script.sh
  • processo para o pspróprio comando
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

o que estou recebendo é:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
the_velour_fog
fonte
2
Por que não usar pstree?
muru
@muru Eu tentei pstreee não consegui que ele produzisse resultados significativos, acho que pstree $$apenas bash--pstreenão produzi exatamente o que estava procurando.
the_velour_fog 20/02
Como não é o que você está procurando? Você substituiu o script e ps, então, o que mais espera ver, exceto pstree?
muru
@ muru seu direito é tecnicamente o que eu queria, mas muito mínimo. ou seja, como você tem certeza de quais processos está olhando sem um PID, como o ps, mostra a saída da tabela?
2141616
4
pstree -p $$? Ou, se você quiser mais informações sobre a linha de comando pstree -pa $$,. Ou, se você quiser mostrar todos os processos pai subindo pstree -psa $$,.
muru

Respostas:

30

Experimentar

# ps -aef --forest
root     114032   1170  0 Apr05 ?        00:00:00  \_ sshd: root@pts/4
root     114039 114032  0 Apr05 pts/4    00:00:00  |   \_ -bash
root      56225 114039  0 13:47 pts/4    00:00:16  |       \_ top
root     114034   1170  0 Apr05 ?        00:00:00  \_ sshd: root@notty
root     114036 114034  0 Apr05 ?        00:00:00  |   \_ /usr/libexec/openssh/sftp-server
root     103102   1170  0 Apr06 ?        00:00:03  \_ sshd: root@pts/0
root     103155 103102  0 Apr06 pts/0    00:00:00  |   \_ -bash
root     106798 103155  0 Apr06 pts/0    00:00:00  |       \_ su - postgres
postgres 106799 106798  0 Apr06 pts/0    00:00:00  |           \_ -bash
postgres  60959 106799  0 14:39 pts/0    00:00:00  |               \_ ps -aef --forest
postgres  60960 106799  0 14:39 pts/0    00:00:00  |               \_ more
GILBERTO LINS
fonte
5
A pergunta implicava em procurar uma árvore de processo iniciando em um processo específico, levando $1argumento para um script ou usando $$para olhar para a árvore iniciando no shell atual ... Você pode atualizar sua resposta para incluir informações sobre como obter uma floresta iniciando em um processo específico?
Filbranden
23

Encontrei depois de ler esta resposta de superusuário , observando este comentário

Mas não para um PID (-p) porque ele imprime apenas o processo específico, mas para a sessão (-g)

e experimentando

ps f -g<PID>

resultado

$ ./script.sh $$
  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
 9906 pts/24   S+     0:00  \_ bash ./script.sh 14492
 9907 pts/24   R+     0:00      \_ ps f -g14492
the_velour_fog
fonte
3
da página de manual:OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
phyatt 16/02
1

Você pode usar o comando ps f -g <PID>e o processo raiz para PID:

#> ps f -g 0

PID TTY      STAT   TIME COMMAND
2 ?        S      0:00 [kthreadd]
3 ?        S      0:01  \_ [ksoftirqd/0]
7 ?        S      0:19  \_ [rcu_sched]
Richard J.
fonte
1

Tente o seguinte:

 $ ps -afx
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00  \_ [kworker/0:0H]
    6 ?        I<     0:00  \_ [mm_percpu_wq]
    7 ?        S      0:14  \_ [ksoftirqd/0]
    8 ?        I      0:34  \_ [rcu_sched]
    9 ?        I      0:00  \_ [rcu_bh]
   10 ?        S      0:00  \_ [migration/0]
   11 ?        S      0:00  \_ [watchdog/0]
sluge
fonte