Comando Killall en Linux con ejemplos

La línea de comandos de Linux ofrece varios comandos para matar un proceso. Por ejemplo, el comando ‘kill’ puede usarse para matar un proceso pasando su PID como argumento, el comando ‘pkill’ toma un patrón como entrada y todos los procesos en ejecución coincidentes se eliminan. Pero existe un comando ‘killall’, que coincide exactamente con el nombre del argumento por defecto y mata el proceso de emparejamiento.
En este artículo, analizaremos este comando con algunos ejemplos prácticos. El comando killall se puede usar para enviar una señal a un proceso en particular usando su nombre. Significa que si tiene cinco versiones del mismo programa ejecutándose, el comando killall eliminará las cinco.
La señal se puede especificar como un argumento para este comando o de lo contrario SIGTERM se envía por defecto. Un proceso puede generar procesos secundarios que son independientes del proceso padre, lo que significa que cada subproceso se identifica por su pid. Con el comando kill, usamos el pid para seleccionar el subproceso a matar pero con el comando killall, indicando el nombre, debido a que todos los subprocesos y el proceso padre tienen el mismo nombre, todos los procesos serán eliminados.
Analicemos el uso del comando killall a través de algunos ejemplos prácticos.
1) Enumere todas las señales admitidas
El comando Kill admite algunas señales que se pueden enumerar con -l
opción. killall envía señales a los procesos. Puedes usar el -s
opción (seguida del nombre de la señal) para enviar una señal particular a un proceso.
$ killall -l HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
Por defecto SIGTERM / PLAZO (15) se envía al proceso, si no, se envía una señal al comando killall. Las señales anteriores son útiles tanto por los usuarios como por los administradores de sistemas. Entonces, killall admite todas estas señales.
2) Mata un proceso en particular
Para matar un proceso, debemos identificarlo para verificar si se está ejecutando. Podemos matar un proceso en particular por su nombre. Supongamos que hay dos procesos que tienen los mismos caracteres iniciales:
$ ps -aef | grep "test" himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again
Ahora, así es como puede usar el comando killall para matar ‘test_again’:
$ killall test_again [2]+ Terminated ./test_again
Como puede ver, el comando killall terminó el proceso ‘test_again’. Esto también se puede confirmar mediante el comando ps:
$ ps -aef | grep "test" himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
Observe que ‘test_again’ no se muestra en la salida cuando se mata.
3) Elimina un proceso ignorando el caso
El comando killall distingue entre mayúsculas y minúsculas de forma predeterminada. Aquí hay un ejemplo :
$ ps -aef | grep "test" himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test
puedes ver que todos nuestros procesos están en minúsculas. Intentemos matar el proceso «./test» pero ingresamos el nombre en mayúscula
$ killall TEST TEST: no process found
Entonces puede ver que el comando killall no pudo encontrar ningún proceso llamado TEST, mientras que un proceso llamado ‘prueba’ ya se está ejecutando. Para asegurarse de que el comando killall ignore el caso, use el -I
opción. Aquí hay un ejemplo :
$ killall -I TEST [1]- Terminated ./test
Observe que ahora terminó con éxito el proceso de ‘prueba’.
4) Matar procesos con confirmación
El comando killall se puede usar para matar más que un proceso.
$ killall test test_again [2]- Terminated ./test_again [3]+ Terminated ./test
Pero, puede ocurrir que se cometa un error al insertar el nombre del proceso indicando otro nombre. Puede ser un problema grave si el proceso indicado es un proceso crítico para el sistema. Por tanto, se recomienda utilizar killall para finalizar procesos de forma interactiva solicitando una confirmación. Para hacerlo, puede utilizar el -i
opción.
$ killall -i test test_again Kill test(4201) ? (y/N) y Kill test_again(4202) ? (y/N) y [1]- Terminated ./test [2]+ Terminated ./test_again
Entonces puede ver que de esta manera el usuario puede controlar la terminación de los procesos usando el comando killall.
5) Mata al proceso en silencio
A veces, cuando killall no puede encontrar un proceso específico, se queja de lo mismo en la salida.
Aquí hay un ejemplo:
$ killall TEST TEST: no process found
Pero, en caso de que desee que killall lleve a cabo su trabajo en silencio, puede utilizar el -q
opción:
$ killall -q TEST $
Entonces puede ver que cuando se usó -q, se suprimió la salida.
6) Un resultado extraño del comando killall
La página de manual del comando killall dice que, de forma predeterminada, coincide con los nombres completos solo si tienen una longitud menor o igual a 15 caracteres. Por lo tanto, si el nombre de un comando tiene más de 15 caracteres, es posible que el nombre completo no esté disponible (es decir, se intercambie). En este caso, Mátalos a todos matará todo lo que coincida dentro de los primeros 15 caracteres.
Por ejemplo, suponga que hay dos procesos siguientes con nombres largos:
$ ps -aef | grep "test" himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh
El primer proceso en la salida anterior tiene exactamente 15 caracteres en el nombre. Intentemos matarlo usando el comando killall:
$ killall test_abcdefghij [1]- Terminated ./test_abcdefghij
Entonces puede ver que el comando killall mata el proceso con éxito.
Ahora, de acuerdo con la página del manual, si ambos nombres hubieran tenido más de 15 caracteres coincidentes, killall habría matado los procesos donde el nombre va seguido de -e
opción o matará todo lo que coincida dentro de los primeros 15 caracteres. Aquí hay un ejemplo :
$ ps -aef | grep "test" himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test
Observe que ambos procesos ahora tienen más de 15 caracteres coincidentes en su nombre. Ahora, cuando intenté matar el segundo proceso usando killall:
$ killall test_abcdefghijklmnopqrstuvwxyz [6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz
Mató solo el proceso especificado y no también el segundo proceso
$ ps -aef | grep "test" himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test
No estoy seguro de si hay algo incorrecto de mi parte o si es un error en el comando killall. Le agradecería que presentara sus puntos de vista sobre esto en los comentarios.
Por cierto, aquí están los detalles del comando killall en mi sistema:
$ killall --version killall (PSmisc) 22.20 Copyright (C) 1993-2012 Werner Almesberger and Craig Small PSmisc comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under the terms of the GNU General Public License. For more information about these matters, see the files named COPYING.
Conclusión
Desde Centos 7, alienta a ejecutar pkill en lugar de killall, por lo que, de forma predeterminada, es posible que obtenga el error » killall: comando no encontrado » cuando ejecute el comando. Si aún lo desea, instale pkill agregando el paquete psmisc (# yum install psmisc).
Killall es útil porque podemos matar un proceso por su nombre incluso si no podemos recordar su pid. No tiene algunas opciones porque es relativamente fácil de usar.
Leer también: