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

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

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

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]

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]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.