Como você mata uma árvore de processo no linux? [fechadas]


14

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

Existe um comando ou um utilitário que me permita matar um processo e todos os seus processos filhos ao mesmo tempo? Eu costumo recorrer manualmente a coletar todos os pids em um comando de matar, mas parece estúpido.

Essa pergunta do SO pergunta como fazer isso com o perl, mas qualquer coisa que faça o trabalho seria ótimo.


Parece que pkill -9é mais poderoso do que pkill, por qualquer motivo.
Andrew Andrew

Respostas:



13

Supondo que os processos compartilhem um identificador de sessão (o que eles devem, a menos que tenham explicitamente chamado setsid (), você pode matá-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 faço:

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 de um pai, não uma cadeia de processos associados.


2

Normalmente, um cliente respondente 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 terminação normal provavelmente não provocará resposta.

Então, você passa a enviar um SIGKILL, que instrui o próprio sistema a interromper esse processo agora - o que pode ser feito na maioria das vezes, exceto quando o processo está em um estado de suspensão ininterrupta, como esperar por alguma E / S entrada ou similar.

Nesse caso, até o SIGKILL acabará não fazendo nada no processo; o processo filho provavelmente terá um estado semelhante de retardo.

Há um caso de fronteira em que o processo pai pode terminar muito bem, mas o processo filho não é passível de matança. Então você terminará com um processo de zumbi que não pode ser limpo desde que seu pai se foi, mas não está respondendo a nada. A única maneira de se livrar deles é uma reinicialização; na maioria dos casos, porém, são bastante inofensivos, pois a única coisa que fazem é usar um PID, enquanto o soquete que tentaram usar já desapareceu.


2

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

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.