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:
- ¿Cuándo y por qué debería
kill -9
usarse? ¿Cuándo y por qué no? - ¿Qué se debe probar antes de hacerlo?
- ¿Qué tipo de depuración de un proceso "bloqueado" podría causar más problemas?
Respuestas:
En general, debe usar
kill
(abreviaturakill -s TERM
o en la mayoría de los sistemaskill -15
) beforekill -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 ignorarSIGKILL
, pero sí se pueden detectarSIGTERM
). 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
,ltrace
ygdb
generalmente son buenas ideas para ver por qué un proceso atascado está atascado. (truss -u
en Solaris es particularmente útil; encuentro que conltrace
demasiada frecuencia presenta argumentos para las llamadas a la biblioteca en un formato inutilizable). Solaris también tiene/proc
herramientas útiles, algunas de las cuales se han portado a Linux. (Apstack
menudo es útil).fuente
kill -9
tiene 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.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).fuente
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.
fuente
kill -9
mismo 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 okill -9
no 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.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.
fuente
No se menciona en todas las otras respuestas es un caso en el
kill -9
que 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 -9
un<defunct>
procesops -ef
para 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 -ef
hace .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 -9
hace para un proceso, úselo solo como último recurso , y si necesita ejecutar kill, use las señales especificadas anteriormente antes de usar-9 (KILL)
fuente
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:Tenga en cuenta que
kill
no 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.fuente
kill -9 1
es ignorado bajo la mayoría de los unices. No hay necesidad de evitarkill -9
paramount
, pero no tiene sentido, ya sea en el mismo. No sé a qué te refieres con "invertir el orden de los procesos".kill -9
detiene (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 procesokill -9
libera la mayoría de los recursos, pero no todos .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
SIGKILL
a un pid no es garantía de matarlo. Si está atascado en una llamada al sistema o ya está zombie (Z
inps
), puede continuar siendo zombie. Este suele ser el caso de ^ Z un proceso de larga ejecución y olvidarsebg
antes de intentarlokill -9
. Un simplefg
volverá 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ésSIGKILL
de 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
kill
con el PID negado, no solo el PID en sí . No hay ninguna garantía deSIGHUP
,SIGPIPE
oSIGINT
u 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 -1
es un poco más dañino quekill -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)fuente
Por qué no quieres
kill -9
un proceso normalmenteDe acuerdo a
man 7 signal
: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 -9
un procesoDebe asegurarse de que antes de enviar la señal al proceso que:
kill -9
al proceso esencialmente provocará la pérdida de estos datos.fuente
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
SIGTERM
ySIGKILL
, o inclusoSIGTERM
,SIGINT
ySIGKILL
. 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
fuente