Típicamente es necesario identificar un proceso por PID (identificador de proceso) al momento de matarlo o enviar una señal con kill. Sin embargo, es posible matar o enviar señales a procesos por nombre de ejecutable utilizando la herramienta killall.



El comando killall envía una señal a todos los procesos corriendo un comando específico. Veamos un ejemplo.

En un determinado momento se están ejecutando los siguientes procesos cuyo nombre de ejecutable comienza con ping

root@hal9000:~# ps aux | grep '[p]ing'
root     14111  0.0  0.0  11240  3028 pts/3    S    12:13   0:00 ping -i 60 www.kernel.org
emi      14117  0.0  0.0  11240  2960 pts/4    S+   12:14   0:00 ping www.google.com
emi      14122  0.0  0.0  11240  2936 pts/5    S+   12:14   0:00 ping4 hotmail.com

Es posible matarlos a todos de la siguiente forma:

root@hal9000:~# killall ping
[1]+  Terminated              ping -i 60 www.kernel.org > /dev/null  (wd: /home/emi/testc)
(wd now: ~)

Tal como se observa, para los procesos que pertenecen a la lista de trabajos de la sesión actual, se muestra un mensaje en la salida de la terminal Bash indicando su cambio de estado.

Sin embargo uno de los procesos continúa en ejecución. Esto se debe a que el nombre del archivo ejecutable no coincide exactamente con "ping":

root@hal9000:~# ps aux | grep '[p]ing'
emi      14122  0.0  0.0  11240  2936 pts/5    S+   12:14   0:00 ping4 hotmail.com

Si se quisiera matar a todos los procesos cuyo nombre de ejecutable contenga la palabra "ping", se puede utilizar el parámetro como expresión regular, mediante la opción -r:

root@hal9000:~# killall -r ping
root@hal9000:~# ps aux | grep '[p]ing'
root@hal9000:~# echo $?
1

Esta opción interpreta al parámetro como una expresión regular POSIX (man regex).

Por otro lado (y al igual que ocurre con kill), sólo es posible enviar señales a procesos a los que se tiene permiso según el id de usuario actual. Por ejemplo, si se intentan matar todos los procesos ping desde una cuenta de usuario no privilegiado:

emi@hal9000:~$ ps aux | grep '[p]ing'
root     14217  0.0  0.0  11240  2932 pts/3    S    12:19   0:00 ping -i 60 www.kernel.org
emi      14219  0.0  0.0  11240  2900 pts/4    S+   12:19   0:00 ping www.google.com
emi      14226  0.0  0.0  11240  2956 pts/5    S    12:19   0:00 ping4 hotmail.com
emi@hal9000:~$ killall -r ping
ping(14217): Operation not permitted
[1]+  Terminated              ping4 hotmail.com > /dev/null

En este caso killall mata todos los que sea posible, y falla en el resto:

emi@hal9000:~$ ps aux | grep '[p]ing'
root     14217  0.0  0.0  11240  2932 pts/3    S    12:19   0:00 ping -i 60 www.kernel.org

Al igual que kill, por defecto se envía la señal SIGKILL (9). Sin embargo es posible enviar cualquier otra empleando -SIGNAL. Por ejemplo SIGTERM (15):

root@hal9000:~# ps aux | grep '[p]ing'
root     14319  0.0  0.0  11240  2840 pts/3    S    12:22   0:00 ping -i 60 www.kernel.org
emi      14320  0.0  0.0  11240  2928 pts/4    S+   12:22   0:00 ping www.google.com
emi      14322  0.0  0.0  11240  2932 pts/5    S    12:22   0:00 ping4 hotmail.com
root@hal9000:~# killall -15 -r ping
[1]+  Terminated              ping -i 60 www.kernel.org
root@hal9000:~# ps aux | grep '[p]ing'
root@hal9000:~# echo $?
1

Cuando el nombre de ejecutable contiene barras (por ejemplo cuando se usa la ruta absoluta al ejecutable), y no está presente la opción -r, se mata de todas formas. Por ejemplo:

root@hal9000:~# which ping
/bin/ping
root@hal9000:~# /bin/ping -i 60 www.kernel.org &
[1] 14460
root@hal9000:~# PING ord.git.kernel.org (147.75.58.133) 56(84) bytes of data.
64 bytes from ord1.git.kernel.org (147.75.58.133): icmp_seq=1 ttl=51 time=193 ms

Por más que sea una ruta absoluta, si el nombre del archivo ejecutable coincide, se selecciona para ser matado:

root@hal9000:~# ps aux | grep '[p]ing'
root     14460  0.0  0.0  11240  3024 pts/3    S    12:29   0:00 /bin/ping -i 60 www.kernel.org
root@hal9000:~# killall ping
[1]+  Terminated              /bin/ping -i 60 www.kernel.org
root@hal9000:~# ps aux | grep '[p]ing'
root@hal9000:~# echo $?
1

Por último, killall dispone de una opción interactiva. Esto permite seleccionar manualmente cuáles de los procesos que coinciden con el nombre son matados, para mayor seguridad:

root@hal9000:~# ps aux | grep '[p]ing'
emi      14520  0.0  0.0  11240  2952 pts/4    S+   12:30   0:00 ping www.google.com
emi      14521  0.0  0.0  11240  2940 pts/5    S    12:30   0:00 ping4 hotmail.com
root     14523  0.0  0.0  11240  3020 pts/3    S    12:31   0:00 /bin/ping -i 60 www.kernel.org
root@hal9000:~# killall -r -i ping
Kill ping(14520) ? (y/N) y
Kill ping4(14521) ? (y/N) n
Kill ping(14523) ? (y/N) y
[1]+  Terminated              /bin/ping -i 60 www.kernel.org
root@hal9000:~# ps aux | grep '[p]ing'
emi      14521  0.0  0.0  11240  2940 pts/5    S    12:30   0:00 ping4 hotmail.com

Simplemente basta con responder sí/no (y/n) para seleccionar cuáles matar.

Cabe destacar que un proceso killall nunca se mata a sí mismo, aunque es capaz de matar a otras instancias en ejecución. Para más opciones, consultar su página de manual.

Referencias

  • man killall
  • man signal
  • man regex


Tal vez pueda interesarte


Compartí este artículo