Eu quero matar uma cadeia de processos, por exemplo
PID PPID
100 XXX
101 100
102 101
Quando uso pkill -P 100
o PID 100 e 101 morrem conforme o esperado, mas 102 recebe init como PPID.
Como posso forçar o pkill a continuar eliminando processos encadeados após os descendentes imediatos de um processo?
Responder1
pkill
está fazendo exatamente o que você disse para fazer: eliminou os processos cujo pai é 100. Não os processos cujo pai do pai é 100.
Nem o Linux pkill
nem o FreeBSD têm a opção de percorrer a árvore de processos. Você pode chamar pstree -l
e analisar sua saída.
Tenha em mente que se A bifurca B, B bifurca C e então B morre, não resta nenhuma relação pai-filho que possa conectar A e C.
Pode haver uma maneira de eliminar todos esses processos, mas cuidado, pois isso pode ser excessivo.
Se você passar um ID de processo negativo para kill
, isso matará todo ogrupo de processos. Isso é atômico, portanto funciona mesmo se um dos processos for bifurcado no momento em que você está executando o kill
. Isso mata apenas os processos que não foram colocados em seu próprio grupo e também mata o processo pai e outros se estiverem no mesmo grupo de processos. Execute ps -o pgid …
para ver o ID do grupo de processos.
Se todos os processos que você deseja eliminar tiverem um arquivo específico aberto, você poderá usar fuser -k /some/file
para matartodosos processos que possuem este arquivo aberto.
Outra opção no Linux éexecute os processos em seu próprio namespace PID. Você pode então eliminar todo o namespace eliminando o pseudo-PGID -1 de dentro do namespace.