¿Cómo se mata un árbol de procesos en Linux? [cerrado]

14

A veces, enviar un SIGTERM a un proceso hará que envíe SIGTERM a todos sus procesos secundarios. Sin embargo, a veces esto no funciona.

¿Hay un comando o una utilidad que me permita matar un proceso y todos sus procesos secundarios al mismo tiempo? Por lo general, recurro a la recopilación manual de todos los pids en un comando de matar, pero se siente estúpido.

Esta pregunta SO pregunta cómo hacer esto con Perl, pero cualquier cosa que haga el trabajo sería genial.

itsadok
fuente
Parece que pkill -9es más poderoso que pkill, por cualquier razón.
Andrew

Respuestas:

13

Suponiendo que los procesos comparten un identificador de sesión (que deberían a menos que hayan llamado explícitamente setsid (), puede matarlos por sesión 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$

Si desde otra terminal hago:

pkill -9 -s 12804

Entonces todo muere de un solo golpe.

De manera similar, puede matar por grupo de procesos, aunque esto tiende a ser más útil para muchos niños que están todos un nivel por debajo de un padre, no una cadena de procesos asociados.

James F
fuente
2

Por lo general, un cliente que responde debe recibir un sigterm y desconectarse de sí mismo, finalizando así todos sus procesos secundarios bifurcados. Si, por otro lado, el cliente no responde, una señal de terminación normal probablemente no provocará ninguna respuesta.

Entonces, procede a enviar un SIGKILL, que le dice al sistema que haga que el proceso se detenga, ahora, lo que puede hacer la mayoría de las veces, excepto cuando el proceso está en un estado de suspensión ininterrumpida, como esperar alguna E / S entrada o similar.

En ese caso, incluso el SIGKILL terminará sin hacer nada al proceso; el proceso del niño probablemente tendrá un estado similar de retraso.

Hay un caso límite en el que el proceso padre podría terminar bien, pero el proceso hijo no se puede matar. Luego terminarás con un proceso zombie que no se puede limpiar ya que su padre ya no está, pero no responde a nada. La única forma de deshacerse de ellos es reiniciando; en la mayoría de los casos, sin embargo, son bastante inofensivos, ya que lo único que hacen es tomar un PID mientras que cualquier socket que intentaron usar ya se ha marchitado.

towo
fuente
2

Si quiero matar el árbol de procesos de Firefox, entonces es posible matarlo con el comando anterior "pkill -9 -s firefox"


fuente