![Killall no mata a todos y rara vez mata, ¿para qué sirve entonces el comando?](https://rvso.com/image/833372/Killall%20no%20mata%20a%20todos%20y%20rara%20vez%20mata%2C%20%C2%BFpara%20qu%C3%A9%20sirve%20entonces%20el%20comando%3F.png)
De vez en cuando uso el killall
comando para finalizar procesos. La razón por la que digo ocasionalmente es que en algunos casos no me ha funcionado.
Un ejemplo reciente fue con Thunderbird, donde había aproximadamente 5 instancias en la memoria, así que decidí usar el killall
comando. Eliminó 2 procesos y aún quedaban 3 en la memoria. Lo intenté de nuevo y los 3 seguían allí.
Así que utilicé manualmente el kill -9
comando para eliminar cada uno de los procesos individuales a través de sus pids. Eso funciono.
Utilizo principalmente el kill -9
comando porque funciona. El killall
comando me ha decepcionado tantas veces que simplemente no me molesto en usarlo. Pero debe haber una razón por la cual no funciona. ¿Lo estoy usando mal?
Sé que hay otros comandos similares pkill
, pero agradecería entender por qué el killall
comando no funciona como se esperaba. Incluso he intentado matar solo un proceso y es un asunto de al azar. Pero el kill -9
comando funciona siempre.
¿Algunas ideas?
PD: sudo
no hace la diferencia
Respuesta1
De la página de manual de Killall.
Killall envía una señal a todos los procesos que ejecutan cualquiera de los comandos especificados. Si no se especifica ningún nombre de señal, se envía SIGTERM.
Cuando haces un kill -9
, estás enviando la señal SIGKILL. Si desea enviar un SIGKILL con Killall, debe hacer
killall -s SIGKILL <PROCESSNAME>
Una buena explicación de la diferencia entre SIGKILL y SIGTERM (y por qué deberías probar SIGTERM primero)
Dehttp://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/
Enviar señales a procesos usando kill en un sistema Unix no es un tema nuevo para la mayoría de los administradores de sistemas, pero me han preguntado muchas veces sobre la diferencia entre kill y kill -9.
Cada vez que usas matar en un proceso, en realidad estás enviando una señal al proceso (en casi todas las situaciones, hablaré de eso pronto). Las aplicaciones C estándar tienen un archivo de encabezado que contiene los pasos que debe seguir el proceso si recibe una señal particular. Puede obtener una lista completa de las señales disponibles en su sistema consultando la página de manual para eliminar.
Considere un comando como este:
kill 2563
Esto enviaría una señal llamada SIGTERM al proceso. Una vez que el proceso recibe el aviso, pueden suceder algunas cosas diferentes:
- el proceso puede detenerse inmediatamente
- el proceso puede detenerse después de un breve retraso después de limpiar los recursos
- el proceso puede seguir ejecutándose indefinidamente
La aplicación puede determinar qué quiere hacer una vez que se recibe un SIGTERM. Si bien la mayoría de las aplicaciones limpiarán sus recursos y se detendrán, es posible que algunas no. Una aplicación puede configurarse para hacer algo completamente diferente cuando se recibe un SIGTERM. Además, si la aplicación está en mal estado, como esperando E/S del disco, es posible que no pueda actuar sobre la señal que se envió.
La mayoría de los administradores de sistemas suelen recurrir a la señal más abrupta cuando una aplicación no responde a un SIGTERM:
kill -9 2563
El -9 le dice al comando Kill que desea enviar la señal n.° 9, que se llama SIGKILL. Con un nombre así, es obvio que esta señal tiene un poco más de peso.
Aunque SIGKILL se define en el mismo archivo de encabezado de señal que SIGTERM, el proceso no puede ignorarlo. De hecho, el proceso ni siquiera es consciente de la señal SIGKILL ya que la señal va directamente al inicio del núcleo. En ese momento, init detendrá el proceso. El proceso nunca tiene la oportunidad de captar la señal y actuar en consecuencia.
Sin embargo, es posible que el kernel no pueda finalizar con éxito el proceso en algunas situaciones. Si el proceso está esperando E/S de red o de disco, el kernel no podrá detenerlo. El núcleo tampoco puede detener los procesos zombies y los procesos atrapados en un sueño ininterrumpido. Es necesario reiniciar para borrar esos procesos del sistema.
Cuando envió Killall (SIGTERM) a los procesos de Thunderbird, solicitó que esos procesos se detuvieran. Algunos de esos procesos no funcionaban correctamente (probablemente por eso era necesario eliminarlos en primer lugar), por lo que no podían actuar según la señal SIGTERM.
Respuesta2
killall
acepta la mayor parte de la misma sintaxis que kill
. En particular, no es necesario escribir nada sofisticado para lograr killall
el equivalente a kill -9
. Esto funciona bien:
killall -9 thunderbird
(Por supuesto, como se mencionó anteriormente, generalmente debería ser reacio a usar killall -9
o, de manera equivalente, killall -KILL
a menos que ya se hayan probado otras medidas sin éxito).
Respuesta3
Para aquellos que buscan una respuesta rápida:
sudo killall -s SIGTERM processname