Esta pergunta SO aborda isso.
À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 um utilitário que me permita eliminar um processo e todos os seus processos filhos ao mesmo tempo? Eu costumo recorrer a coletar manualmente todos os pids em um comando kill, mas parece estúpido.
Esta pergunta SO pergunta como fazer isso com o perl, mas tudo que fizer o trabalho seria ótimo.
Esta pergunta SO aborda isso.
Assumindo que os processos compartilham 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 fizer:
pkill -9 -s 12804
Então tudo morre de uma só vez.
Você pode matar de maneira semelhante por grupo de processos, embora isso tenda a ser mais útil para muitos filhos que estão todos em um nível abaixo de um pai, não em uma cadeia de processos associados.
Normalmente, um cliente que responde deve receber um sigterm e desligar-se, encerrando assim todos os seus processos filho bifurcados. Se, por outro lado, o cliente não estiver respondendo, um sinal de terminação normal provavelmente não gerará resposta.
Então, você começa a enviar 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 estado ininterrupto de espera, como esperar por algum Entrada de E / S ou similar.
Nesse caso, até mesmo o SIGKILL acabará não fazendo nada ao processo; o processo da criança provavelmente estará em um estado similar de retardamento.
Há um caso de borda onde o processo pai pode terminar bem, mas o processo filho não pode ser eliminado. Então você vai acabar 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 é um reboot; na maioria dos casos, porém, eles são completamente inofensivos, já que a única coisa que fazem é usar um PID enquanto o soquete que eles tentaram usar já desapareceu.
Se eu quiser matar a árvore do processo do Firefox, então é possível matá-lo pelo comando acima "pkill -9 -s firefox"