¿Cuándo no debería matar -9 a un proceso?


401

Siempre dudo mucho en ejecutar kill -9, pero veo que otros administradores lo hacen casi de manera rutinaria.

Me imagino que probablemente haya un punto medio sensible, así que:

  1. ¿Cuándo y por qué debería kill -9usarse? ¿Cuándo y por qué no?
  2. ¿Qué se debe probar antes de hacerlo?
  3. ¿Qué tipo de depuración de un proceso "bloqueado" podría causar más problemas?

Respuestas:


362

En general, debe usar kill(abreviatura kill -s TERMo en la mayoría de los sistemas kill -15) before kill -9( kill -s KILL) para dar al proceso objetivo la oportunidad de limpiarse después de sí mismo. (Los procesos no se pueden detectar o ignorar SIGKILL, pero sí se pueden detectar SIGTERM). Si no le da al proceso la oportunidad de terminar lo que está haciendo y limpiar, puede dejar archivos corruptos (u otro estado) alrededor de eso. no podrá entender una vez reiniciado.

strace/ truss, ltracey gdbgeneralmente son buenas ideas para ver por qué un proceso atascado está atascado. ( truss -uen Solaris es particularmente útil; encuentro que con ltracedemasiada frecuencia presenta argumentos para las llamadas a la biblioteca en un formato inutilizable). Solaris también tiene /procherramientas útiles, algunas de las cuales se han portado a Linux. (A pstackmenudo es útil).


67
La razón convincente es que si tiene la costumbre de enviar SIGKILL, cuando llegue a un programa que, por ejemplo, corromperá una base de datos importante para usted o su empresa, realmente lo lamentará. kill -9tiene su uso, como terminador de último recurso, énfasis en último recurso; los administradores que lo usan antes del último recurso a) no entienden ser un administrador demasiado bien, yb) no deberían estar en un sistema de producción.
Arcege

99
@Mikel Otra cosa es superarlo, a veces es mejor engañar a una aplicación para que se limpie con una señal como SIGQUIT o SIGSEGV si no responde a SIGINT / SIGTERM. Por ejemplo, una aplicación 3D a pantalla completa o incluso Xorg. Usando SIGQUIT, no tendrá la oportunidad de limpiar nada, pero engañándolo para que piense que ocurre una falla de segmento y sentirá que no tiene más remedio que limpiar y salir.
penguin359

12
@ Argege ¿Crees que usar una base de datos que corrompe los datos si se mata con -9 es una base de datos que vale la pena usar después de todo? Iirc, mysql, bdb, pg, etc ... todos se comportan bien cuando se mata con -9.
dhruvbird

13
killall -9 java ftw
dmourati

23
@dhruvbird: el hecho de que se suponga que sus DB vienen equipados con chalecos antibalas no significa que deba dispararles si no es necesario. Si bien puede tener razón en que no es tan arriesgado como parece decir Arcege, creo que su punto sigue siendo que es arriesgado y debería ser un último recurso.
iconoclasta

228

Randal Schwartz solía publicar con frecuencia "Uso inútil de (x)" en las listas. Una de esas publicaciones fue sobre kill -9. Incluye razones y una receta a seguir. Aquí hay una versión reconstruida (citada a continuación).

(Cita abominación)

No no no. No uses kill -9.

No le da al proceso la oportunidad de limpiar:

1) apague las conexiones del zócalo

2) limpiar archivos temporales

3) informar a sus hijos que se va a ir

4) restablecer sus características de terminal

Y así sucesivamente y así sucesivamente y así sucesivamente.

En general, envíe 15 y espere un segundo o dos, y si eso no funciona, envíe 2, y si eso no funciona, envíe 1. Si eso no funciona, ¡QUITE EL BINARIO porque el programa se comportó mal!

No uses kill -9. No saque la cosechadora solo para ordenar la maceta.

Solo otro uso inútil de Usenet,

(.firma)


12
¿El sistema operativo no cerrará ningún descriptor de archivo abierto (incluidos los sockets) cuando finalice el proceso?
Brian Gordon

3
Sí lo hará Pero suponga que está eliminando un proceso de servidor con clientes conectados, entonces los clientes no notarán que el servidor se ha ido antes de que se agote el tiempo de espera.
Björn Lindqvist

45
Ah, sí, el viejo argumento de "si de alguna manera es imperfecto eres estúpido para usarlo".
Timmmm

3
O estúpido de usar si el proceso en cuestión es la producción de su empresa
Warren P

3
Si se mata un proceso, el socket enviará RST al igual, donde, como si el proceso llama a cierre o apagado en el socket, el socket envía FIN. No hay tiempo de espera necesario. Una situación de tiempo de espera solo ocurrirá si se corta la energía o se retira el cable de red.
ctrl-alt-delor

78

Siempre debería estar bien hacerlo kill -9, al igual que siempre debería estar bien apagarlo tirando del cable de alimentación. Puede ser antisocial y dejar algo de recuperación por hacer, pero debería funcionar, y es una herramienta poderosa para los impacientes.

Digo esto como alguien que intentará simplemente matar (15) primero, porque le da al programa la oportunidad de hacer un poco de limpieza, tal vez simplemente escribiendo en un registro "saliendo en sig 15". Pero no aceptaré ninguna queja sobre mal comportamiento en un kill -9.

La razón: muchos clientes lo hacen a cosas que los programadores preferirían y luego no. La prueba aleatoria kill -9 es un escenario de prueba bueno y justo, y si su sistema no lo maneja, su sistema está dañado.


2
¿Cómo se prueba para "random kill -9"? Cuando consigues matar -9, ya has terminado.
Karel Bílek

18
@Karel: Usted prueba si su sistema puede recuperarse luego y limpia cualquier transacción desorganizada que se estaba procesando en el momento de SIGKILL.
Tadeusz A. Kadłubowski

77
No está bien hacer lo kill -9mismo que no está bien desconectarlo. Si bien, por supuesto, hay situaciones en las que no tiene otra opción, esta debería ser una acción de último recurso. Por supuesto, tirar del cable de alimentación o kill -9no debería tener efectos adversos, como evitar que la aplicación o el sistema operativo se reinicien correctamente, si sucede, pero sucede una mierda y usar las formas recomendadas ( kill [-15]) o el apagado regular ayudará a evitar el desorden que podría ocurrir si rutinariamente interrumpes programas y sistemas operativos de esa manera. En cualquier caso, siempre existe el riesgo de perder datos, independientemente de la solidez del código.
jlliagre

77
Sospecho que lo que Michael quiso decir con 'OK' es que su programa debe lidiar con esta situación con gracia y poder hacer alguna forma de limpieza al reiniciar. Por ejemplo, limpiar archivos PID, etc., en lugar de simplemente tirar sus juguetes del cochecito y negarse a comenzar.
gerryk

2
@gerryk Deberían hacerlo, pero el problema es que algunas personas tomarán esa respuesta como una "licencia para matar -9" sea cual sea la situación y el medio ambiente. Es una actitud irresponsable.
jlliagre

39

Uso kill -9 de la misma manera que arrojo utensilios de cocina en el lavavajillas: si el lavavajillas arruina un implemento de cocina, entonces no lo quiero.

Lo mismo ocurre con la mayoría de los programas (incluso las bases de datos): si no puedo matarlos sin que las cosas se vuelvan locas, realmente no quiero usarlos. (Y si utiliza una de estas no bases de datos que lo alienta a fingir que tienen datos persistentes cuando no lo tienen: bueno, supongo que es hora de que empiece a pensar en lo que está haciendo).

Porque en el mundo real las cosas pueden fallar en cualquier momento por cualquier motivo.

La gente debería escribir software que sea tolerante a los bloqueos. En particular en servidores. Debe aprender a diseñar software que asuma que las cosas se romperán, se estrellarán, etc.

Lo mismo ocurre con el software de escritorio. Cuando quiero cerrar mi navegador, por lo general tardo EDADES en apagarse. No hay nada que mi navegador deba hacer que deba llevar más de un par de segundos. Cuando le pido que se cierre, debería hacerlo inmediatamente. Cuando no lo hace, bueno, entonces sacamos kill -9 y lo hacemos.


44
Estoy de acuerdo en que un proceso debe ser escrito para ser tolerante a tal falla, pero creo que todavía es una mala práctica hacerlo. Una base de datos se recuperará, pero podría detectar el aborto grosero y luego desencadenar una verificación de recuperación significativa cuando se reinicie. ¿Y qué hay de las solicitudes que atiende un proceso? Todos se cortarán al instante, ¿los clientes pueden tener errores y fallar también?
Daniel James Bryars

3
Una base de datos que no se puede eliminar en cualquier momento no es una base de datos confiable. Este es un requisito bastante básico si necesita consistencia. En cuanto a los clientes: si se vuelven locos y corrompen los datos cuando se corta la conexión, también están mal diseñados. La forma de abordar la pérdida de servicio es a través de la redundancia y las estrategias automáticas de conmutación por error / reintento. Por lo general, la mayoría de las fallas rápidas del sistema son preferibles a tratar de recuperarse.
borud

44
@borud Puede que no sea un software perfectamente escrito, pero es un software que la gente usa todo el tiempo. ¿Qué administradores de sistemas tienen el lujo de poder elegir siempre un software que esté perfectamente escrito, hasta siempre recuperarse con gracia de una interrupción repentina? No muchos. Personalmente, uso scripts de apagado e inicio / parada de procesos a través de esto. Si no responden al script de apagado (que hace una señal adecuada al proceso), mato -9.
Steve Sether

2
No hay diferencia entre cocinar cosas básicas y platos más complejos con respecto a las herramientas. La diferencia es el cocinero. (Sin embargo, si pasas tanto tiempo cocinando como yo, te das cuenta de que la robustez es un requisito mínimo en las herramientas de cocina y que la mayoría de las personas que venden suministros de cocina a los consumidores no conocerían una herramienta mala de una gran herramienta)
borud

1
¿Entonces alienta a las personas a ser descuidadas porque es difícil hacer las cosas correctamente? Cada vez se ejecuta más software en entornos operativos que son efímeros. Si escribe un software que se vuelve exigente si no se cierra correctamente, tendrá dificultades para convencer a los empleadores de que lo contraten como desarrollador.
borud

10

No se menciona en todas las otras respuestas es un caso en el kill -9que no funciona en absoluto, cuando un proceso es <defunct>y no puede ser eliminado:

¿Cómo puedo matar un proceso <defunct> cuyo padre es init?

¿Qué es difunto para un proceso y por qué no lo matan?

Entonces, antes de intentar ejecutar kill -9un <defunct>proceso ps -efpara ver cuál es su padre e intentar el -15(TÉRMINO) o -2(INT) y, por último, -9(MATAR) en su padre.

Nota: que ps -efhace .

Edición y precaución posteriores: proceda con precaución cuando elimine procesos, sus padres o hijos, ya que pueden dejar archivos abiertos o corruptos, conexiones sin terminar, pueden dañar bases de datos, etc. a menos que sepa qué kill -9hace para un proceso, úselo solo como último recurso , y si necesita ejecutar kill, use las señales especificadas anteriormente antes de usar-9 (KILL)


6

Nunca nunca hagas a kill -9 1. También evite matar en ciertos procesos como mount`. Cuando tengo que matar muchos procesos (por ejemplo, una sesión X se cuelga y tengo que matar todos los procesos de un determinado usuario), invierto el orden de los procesos. Por ejemplo:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Tenga en cuenta que killno detiene un proceso y libera sus recursos. Todo lo que hace es enviar una señal SIGKILL al proceso; podrías terminar con un proceso que está colgado.


1
El voto negativo fue alguien más. ¿Pero qué recursos no se liberan? ¿Quiere decir que el proceso no puede realizar su limpieza normal? ¿Qué pasa con los bloqueos de archivos, semáforos, etc.? ¿Puedes elaborar?
Mikel

Parece que la memoria compartida de SysV y los semáforos tendrán que limpiarse, al menos. archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel

8
Esta respuesta es en parte confusa y en parte incorrecta. kill -9 1es ignorado bajo la mayoría de los unices. No hay necesidad de evitar kill -9para mount, pero no tiene sentido, ya sea en el mismo. No sé a qué te refieres con "invertir el orden de los procesos". kill -9detiene (como en, mata) un proceso, sin darle la oportunidad de quejarse, sin embargo, la matanza no ocurrirá de inmediato si el proceso está en una llamada de sistema no interrumpible . Matar un proceso kill -9libera la mayoría de los recursos, pero no todos .
Gilles

5

Los procesos de eliminación no son fáciles: los datos se pueden perder, las aplicaciones mal diseñadas pueden romperse de manera sutil que no se pueden solucionar sin una reinstalación ... pero depende completamente de saber qué es y qué no es seguro en un situación dada y lo que estaría en riesgo. El usuario debe tener una idea de lo que está haciendo o debe hacer un proceso y cuáles son sus limitaciones (disco IOPS, rss / swap) y poder estimar cuánto tiempo debería llevar un proceso de larga duración (digamos una copia de archivo, reencodificación de mp3, migración de correo electrónico, copia de seguridad, [su enlace de tiempo favorito aquí].)

Además, enviar SIGKILLa un pid no es garantía de matarlo. Si está atascado en una llamada al sistema o ya está zombie ( Zin ps), puede continuar siendo zombie. Este suele ser el caso de ^ Z un proceso de larga ejecución y olvidarse bgantes de intentarlo kill -9. Un simple fgvolverá a conectar stdin / stdout y probablemente desbloqueará el proceso, generalmente seguido de la finalización del proceso. Si está atascado en otro lugar o en alguna otra forma de punto muerto del kernel, solo un reinicio puede eliminar el proceso. (Los procesos de Zombie ya están inactivos después SIGKILLde que el núcleo procesa (no se ejecutará más código de usuario), generalmente hay una razón del núcleo (similar a estar "bloqueado" esperando que finalice una llamada al sistema) para que el proceso no finalice).

Además, si desea eliminar un proceso y todos sus elementos secundarios, adquiera el hábito de llamar killcon el PID negado, no solo el PID en sí . No hay ninguna garantía de SIGHUP, SIGPIPEo SIGINTu otras señales de limpiar después de ella, y tener un montón de procesos repudiado a la limpieza (recuerde mestizo?) Es molesto.

Bonus evil: kill -9 -1es un poco más dañino que kill -9 1(No hagas ninguno de los dos como root a menos que quieras ver lo que sucede en un VM descartable y no importante)


3

Por qué no quieres kill -9un proceso normalmente

De acuerdo a man 7 signal:

Las señales SIGKILL y SIGSTOP no pueden capturarse, bloquearse o ignorarse.

Esto significa que la aplicación que recibe cualquiera de estas señales no puede "atraparlas" para realizar ningún comportamiento de apagado.

Lo que debe hacer antes de ejecutar kill -9un proceso

Debe asegurarse de que antes de enviar la señal al proceso que:

  1. Asegúrese de que el proceso no esté ocupado (es decir, haciendo "trabajo"); enviar un mensaje kill -9al proceso esencialmente provocará la pérdida de estos datos.
  2. Si el proceso es una base de datos que no responde, asegúrese de que primero haya vaciado sus cachés. Algunas bases de datos admiten el envío de otras señales al proceso para forzar el vaciado de su caché.

3

He creado un script que ayuda a automatizar este problema.

Se basa en mi respuesta completa 2 en una pregunta muy similar en stackoverflow .

Puedes leer todas las explicaciones allí. Para resumir, recomendaría solo SIGTERMy SIGKILL, o incluso SIGTERM, SIGINTy SIGKILL. Sin embargo, doy más opciones en la respuesta completa.

Por favor, siéntase libre de descargarlo (clonarlo) desde el repositorio de github para matarlo con gracia 1

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.