Como você mata uma árvore de processos no Linux?

Como você mata uma árvore de processos no Linux?

Às vezes, enviar um SIGTERM para um processo fará com que ele envie SIGTERM para todos os seus processos filhos. No entanto, às vezes isso não funciona.

Existe um comando ou utilitário que me permitirá matar um processo e todos os seus processos filhos ao mesmo tempo? Normalmente recorro à coleta manual de todos os pids em um comando kill, mas parece estúpido.

Esta pergunta SOpergunta como fazer isso com perl, mas qualquer coisa que dê conta do recado seria ótima.

Responder1

EsseEntão perguntacobre isso.

Responder2

Supondo que os processos compartilhem um identificador de sessão (o que deveriam, a menos que tenham chamado explicitamente setsid(), você pode eliminá-los por sessão usando pkill:

user@machine:~> ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12916 12804 ps -o pid,sess,cmd -U user
user@machine:~> sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ sh
sh-3.00$ ps -o pid,sess,cmd -U user
  PID  SESS CMD
12804 12804 -bash
12920 12804 sh
12921 12804 sh
12922 12804 sh
12924 12804 sh
12926 12804 sh
12928 12804 sh
12937 12804 ps -o pid,sess,cmd -U user
sh-3.00$

Se de outro terminal eu fizer:

pkill -9 -s 12804

Então tudo morre de uma só vez.

Da mesma forma, você pode matar por grupo de processos, embora isso tenda a ser mais útil para muitos filhos que estão todos um nível abaixo do pai, e não para uma cadeia de processos associados.

Responder3

Normalmente, um cliente que responde deve receber um sigterm e desligar-se, encerrando assim todos os seus processos filhos bifurcados. Se, por outro lado, o cliente não estiver respondendo, um sinal de encerramento normal provavelmente não provocará nenhuma resposta.

Então você envia um SIGKILL, que diz ao próprio sistema para fazer esse processo parar, agora - o que ele pode fazer na maioria das vezes, exceto quando o processo está em um estado de suspensão ininterrupta, como aguardar alguma E/S entrada ou similar.

Nesse caso, mesmo o SIGKILL acabará não fazendo nada no processo; o processo infantil provavelmente estará em um estado semelhante de retardo.

Há um caso limite em que o processo pai pode terminar perfeitamente, mas o processo filho não pode ser eliminado. Então você acabará com um processo zumbi que não pode ser limpo porque seu pai se foi, mas não responde a nada. A única maneira de se livrar deles é reinicializar; na maioria dos casos, porém, eles são bastante inofensivos, pois a única coisa que fazem é usar um PID enquanto qualquer soquete que tentaram usar já definhou.

Responder4

Se eu quiser eliminar a árvore de processos do Firefox, é possível eliminá-la com o comando acima "pkill -9 -s firefox"

informação relacionada