it-swarm-es.com

Killall no mata a todos y rara vez mata, ¿para qué sirve entonces?

De vez en cuando uso el comando killall para matar 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 comando killall. Mató 2 procesos y 3 todavía quedaron en la memoria. Intenté nuevamente y los 3 todavía estaban allí.

Así que usé manualmente el comando kill -9 para matar cada uno de los procesos individuales a través de sus pids. Eso funciono.

Principalmente uso el comando kill -9 mientras funciona. El comando killall 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 como pkill pero agradecería entender por qué el comando killall no funciona como se esperaba. Incluso he tratado de matar solo un proceso y es un asunto impredecible. Pero el comando kill -9 funciona todo el tiempo.

¿Algunas ideas?

PD: Sudo no hace la diferencia

11
Meer Borg

Desde 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 hacerlo

killall -s SIGKILL <PROCESSNAME>

Una buena explicación de la diferencia entre SIGKILL y SIGTERM (y por qué debería probar SIGTERM primero)

De http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

Enviar señales a procesos que usan kill en un sistema Unix no es un tema nuevo para la mayoría de los administradores de sistemas, pero muchas veces me han preguntado sobre la diferencia entre kill y kill -9.

Cada vez que usas kill en un proceso, en realidad estás enviando una señal al proceso (en casi todas las situaciones, lo abordaré 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 verificando la página de manual para matar.

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 de inmediato
  • el proceso puede detenerse luego de un breve retraso luego 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, 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 de disco, es posible que no pueda actuar sobre la señal que se envió.

La mayoría de los administradores de sistemas generalmente recurren 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 # 9, que se llama SIGKILL. Con un nombre como ese, 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 se da cuenta de la señal SIGKILL ya que la señal va directamente al inicio del núcleo. En ese punto, init detendrá el proceso. El proceso nunca tiene la oportunidad de captar la señal y actuar en consecuencia.

Sin embargo, el núcleo puede no ser capaz de matar con éxito el proceso en algunas situaciones. Si el proceso espera E/S de red o disco, el kernel no podrá detenerlo. Los procesos de zombis y los procesos atrapados en un sueño ininterrumpido tampoco pueden ser detenidos por el núcleo. Se requiere un reinicio para borrar esos procesos del sistema.

Cuando envió killall (SIGTERM) a los procesos de Thunderbird, solicitó que se detuvieran. Algunos de esos procesos no funcionaban correctamente (probablemente por eso necesitabas matarlos en primer lugar), por lo que no podían actuar en la señal SIGTERM.

21
tgm4883

killall acepta la mayor parte de la misma sintaxis que kill. En particular, no es necesario escribir nada elegante para que killall haga el equivalente de kill -9. Esto funciona bien:

killall -9 Thunderbird

(Por supuesto, como se discutió, generalmente debería ser reacio a usar killall -9 o, de manera equivalente, killall -KILL, a menos que otras medidas ya se hayan intentado sin éxito).

4
Eliah Kagan