
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.
¿Existe algún comando o utilidad que me permita eliminar un proceso y todos sus procesos secundarios al mismo tiempo? Por lo general, recurro a recopilar manualmente todos los pids en un comando de eliminación, pero se siente estúpido.
Esta pregunta SOPregunta cómo hacer esto con Perl, pero cualquier cosa que haga el trabajo sería genial.
Respuesta1
EsteEntonces preguntacubre esto.
Respuesta2
Suponiendo que los procesos comparten un identificador de sesión (que deberían hacerlo a menos que hayan llamado explícitamente a setsid(), puedes eliminarlos 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 eliminar por grupo de procesos, aunque esto tiende a ser más útil para muchos hijos que están todos un nivel por debajo de un padre, no para una cadena de procesos asociados.
Respuesta3
Por lo general, un cliente que responde debe recibir un sigterm y desactivarse, finalizando así todos sus procesos secundarios bifurcados. Si, por el contrario, el cliente no responde, una señal de terminación normal probablemente no provocará respuesta.
Luego procede a enviar un SIGKILL, que le indica al sistema que haga que el proceso se detenga ahora, lo cual puede hacer la mayoría de las veces, excepto cuando el proceso está en un estado de suspensión ininterrumpida, como esperando algunas E/S. entrada o similar.
En ese caso, incluso SIGKILL terminará sin hacer nada en el proceso; El proceso del niño probablemente se encontrará en un estado similar de retraso.
Hay un caso límite en el que el proceso padre puede terminar bien, pero el proceso hijo no se puede eliminar. Entonces terminarás con un proceso zombie que no se puede limpiar porque su padre se fue, pero no responde a nada. La única forma de deshacerse de ellos es reiniciar; Sin embargo, en la mayoría de los casos, son bastante inofensivos, ya que lo único que hacen es tomar un PID mientras cualquier conector que intentaron usar ya se haya agotado.
Respuesta4
Si quiero eliminar el árbol de procesos de Firefox, ¿es posible eliminarlo con el comando anterior "pkill -9 -s firefox"?