Cuando intentas terminar un proceso para siempre, ¿qué opción de "matar" deberías usar?

26

Recibo muchos mensajes mixtos de personas, y me preguntaba si realmente no hay mucha diferencia en lo que usas.

kill 'x'
killall 'x'
kill -9 'x'

Estas son algunas opciones que me han dicho que use hasta ahora, pero algunas personas dicen que matar -9 es simplemente exagerado, matar por sí solo no funciona, etc.

¿Alguien tiene algún consejo sobre cuál debería usarse en el caso más estándar de simplemente terminar un proceso (y, por lo tanto, también su estado)?

[edit] Estoy buscando qué usar cuando quieres detener la ejecución de tu proceso para que puedas ejecutar uno nuevo, fresco desde el principio

Chuck Testa
fuente
1
Consulte también la carta de formulario UUK9 que advierte contra el abuso SIGKILL.
jw013
1
Para enumerar todas las diferentes señales, junto con su número: kill -ly para traducir un número a su nombre de señal correspondiente, por ejemplo kill -l 9, volverá KILL.

Respuestas:

24

Hay una serie de señales cuya disposición predeterminada es terminar el proceso. La última señal de terminación es SIGKILL ya que no se puede manejar y el proceso no tiene más remedio que morir. Sin embargo, esto también significa que si lo envía, el proceso se ve privado de la oportunidad de limpiar. Por lo tanto, los buenos modales requieren enviar una señal como SIGTERM que se pueda manejar primero y solo si el proceso no se cierra después de un tiempo envíelo SIGKILL.

Tenga en cuenta que SIGINT y SIGQUIT no son buenos candidatos para la terminación arbitraria del proceso. Debido al hecho de que pueden generarse desde el teclado del terminal, muchas aplicaciones los usan para fines especiales. Por ejemplo, el intérprete de Python usa SIGINT para generar una KeyboardInterruptexcepción (también en sesiones interactivas de Python donde simplemente regresa a la solicitud) y JVM usa SIGQUIT para volcar los seguimientos de la pila. SIGINT y SIGQUIT siguen siendo efectivos para la mayoría de las utilidades de línea de comandos estándar como findo cat.

Durante el apagado del sistema, la mayoría de los sistemas UNIX y Linux envían SIGTERM a todo el proceso, seguido de 5 segundos de espera, seguido de SIGKILL. Esta es la forma recomendada de cerrar de forma segura un proceso arbitrario.

Tenga en cuenta también que incluso SIGKILL no puede finalizar un proceso atascado en una espera ininterrumpida hasta que el proceso se active.

Adam Zalcman
fuente
1
Excelente respuesta ¿Tiene una referencia para la kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;recomendación?
l0b0
+1 tipo de respuesta. ¿Y qué hay de SIGHUP?
Alois Mahdal
2
@AloisMahdal: SIGHUPviene del día en que las líneas de acceso telefónico eran comunes. Esa señal fue enviada para indicar que la línea colgó. Más tarde, cuando eso era menos común, los SIGHUPdemonios a veces lo usaban para volver a leer el archivo de configuración sin reiniciar el proceso. En estos tiempos modernos SIGHUPrara vez se usa. Muchos demonios tendrán su propia forma de reinicializar (es decir, apachectl gracefulo rndc reconfig. Para las cosas que no deben usar [init.d|smf|upstart|launchd]controles siempre que sea posible.)
bahamat
13

Debes comenzar con el más suave y escalar desde allí. Esto significa, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Aunque la mayoría de las personas se saltan SIGINT y SIGQUIT.

Ignacio Vazquez-Abrams
fuente
Además, algunas aplicaciones (como el JDK) manejan SIGQUIT de manera diferente. Probablemente no usaría SIGQUIT sin saber cómo lo maneja la aplicación específica.
dimo414