A pstree
solução é muito boa, mas é um pouco reticente. Eu uso em ps --forest
vez disso. Mas não para um PID
( -p
) porque imprime apenas o processo específico, mas para a sessão ( -g
). Ele pode imprimir qualquer informação que ps
possa ser impressa em uma árvore de arte ASCII sofisticada, definindo a -o
opção.
Então, minha sugestão para este problema:
ps --forest -o pid,tty,stat,time,cmd -g 2795
Se o processo não for um líder de sessão, será necessário aplicar um pouco mais de truque:
ps --forest -o pid,tty,stat,time,cmd -g $(ps -o sid= -p 2795)
Isso obtém o ID da sessão (SID) do processo atual primeiro e depois chama ps novamente com esse sid.
Se os cabeçalhos das colunas não forem necessários, adicione um '=' após cada definição de coluna nas opções '-o', como:
ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 2795)
Um exemplo de execução e o resultado:
$ ps --forest -o pid=,tty=,stat=,time=,cmd= -g $(ps -o sid= -p 30085)
27950 pts/36 Ss 00:00:00 -bash
30085 pts/36 S+ 00:00:00 \_ /bin/bash ./loop.sh
31888 pts/36 S+ 00:00:00 \_ sleep 5
Infelizmente, isso não funciona screen
, pois define o sid para cada tela filho e para todos os netos.
Para obter todos os processos gerados por um processo, toda a árvore precisa ser construída. Eu usei awk para isso. Inicialmente, ele cria uma matriz de hash para conter tudo PID => ,child,child...
. No final, chama uma função recursiva para extrair todos os processos filhos de um determinado processo. O resultado é passado para outro ps
para formatar o resultado. O PID real deve ser escrito como um argumento para ativar, em vez de <PID>
:
ps --forest $(ps -e --no-header -o pid,ppid|awk -vp=<PID> 'function r(s){print s;s=a[s];while(s){sub(",","",s);t=s;sub(",.*","",t);sub("[0-9]+","",s);r(t)}}{a[$2]=a[$2]","$1}END{r(p)}')
Para um processo SCREEN (pid = 8041), a saída de exemplo é assim:
PID TTY STAT TIME COMMAND
8041 ? Ss 0:00 SCREEN
8042 pts/8 Ss 0:00 \_ /bin/bash
8092 pts/8 T 0:00 \_ vim test_arg test_server
12473 pts/8 T 0:00 \_ vim
12972 pts/8 T 0:00 \_ vim
ps auxf
.