Como posso obter toda a árvore de processos gerada por um determinado processo exibida como uma árvore e somente essa árvore, ou seja, nenhum outro processo?
A saída poderia, por exemplo, parecer
4378 ? Ss 0:10 SCREEN
4897 pts/16 Ss 0:00 \_ -/bin/bash
25667 pts/16 S+ 0:00 | \_ git diff
25669 pts/16 S+ 0:00 | \_ less -FRSX
11118 pts/32 Ss+ 0:00 \_ -/bin/bash
11123 pts/32 S+ 0:00 \_ vi
Não consegui obter o resultado desejado apenas com parâmetros para ps
.
A seguir, o resultado desejado, mas parece um pouco envolvido:
#!/bin/bash
pidtree() {
echo -n $1 " "
for _child in $(ps -o pid --no-headers --ppid $1); do
echo -n $_child `pidtree $_child` " "
done
}
ps f `pidtree 4378`
Alguém tem uma solução mais fácil?
ps auxf
.Respostas:
A
pstree
solução é muito boa, mas é um pouco reticente. Eu uso emps --forest
vez disso. Mas não para umPID
(-p
) porque imprime apenas o processo específico, mas para a sessão (-g
). Ele pode imprimir qualquer informação queps
possa ser impressa em uma árvore de arte ASCII sofisticada, definindo a-o
opção.Então, minha sugestão para este problema:
Se o processo não for um líder de sessão, será necessário aplicar um pouco mais de truque:
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:
Um exemplo de execução e o resultado:
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 outrops
para formatar o resultado. O PID real deve ser escrito como um argumento para ativar, em vez de<PID>
:Para um processo SCREEN (pid = 8041), a saída de exemplo é assim:
fonte
ps
tivesse uma opção de sinalizador de filtro apenas para filtrar todos os descendentes de um PID.Onde
${pid}
está o pid do processo pai.No Gentoo Linux,
pstree
está no pacote "psmisc", aparentemente localizado emhttp://psmisc.sourceforge.net/fonte
pstree
, mas perdi um formato de saída mais detalhado. No entanto,pstree -p <pid>
pelo menos imprima os pids razoavelmente próximos.sed
tudo o que .. mmm funciona este :)pstree -pn 4008 |grep -o "([[:digit:]]*)" |grep -o "[[:digit:]]*"
Aqui está minha versão que roda instantaneamente (porque
ps
executada apenas uma vez). Funciona em bash e zsh.fonte
echo $1
dentro do primeiro loop for e alterando-o paraecho $i
.Eu criei um pequeno script bash para criar um pid de lista dos processos filhos de um pai. Recursivamente até encontrar o último processo filho que não tem filhos. Não oferece uma visualização em árvore. Apenas lista todos os pid's.
primeiro argumento de list_offspring é o pai pid
fonte
ps -H -g "$pid" -o comm
não adiciona uma árvore em si, é apenas a lista de processos.
dá por exemplo
fonte
-H
opção é usada para exibir uma árvore de processos ou "hierarquia de processos (floresta)"Eu tenho trabalhado para encontrar uma solução para exatamente o mesmo problema. Basicamente, ps manpage não documenta nenhuma opção que permita fazer o que queremos com um único comando. Conclusão: é necessário um script.
Eu vim com um script muito parecido com o seu. Eu colei no meu ~ / .bashrc para que eu possa usá-lo em qualquer shell.
fonte
A caminho na linha de comando:
produz:
A maneira mais elegante dessa maneira é definir uma função em
.bashrc
:em seguida, na linha de comando, execute:
fonte
Isso fornece apenas os pid + filhos, cada um em uma linha, o que é útil para processamento adicional.
fonte
Eu criei um script semelhante baseado no de Philippe acima
Isso gera todos os pids filhos, netos etc. no formato delimitado por espaço. Por sua vez, isso pode ser alimentado ao ps, como em
fonte
para todo o processo - pstree -a show by user - pstree user
fonte