Señales y control de procesos: kill, killall, pkill
Introducción
En Linux, la comunicación con los procesos se realiza mediante señales. Una señal es un mensaje asíncrono que el sistema operativo o un usuario envía a un proceso para indicarle que debe realizar alguna acción: terminar, pausar, recargar configuración, etc.
Señales más importantes
Cada señal tiene un número y un nombre. Las más habituales son:
Número Nombre Descripción
1 SIGHUP Recargar configuración (hangup)
2 SIGINT Interrupción desde teclado (Ctrl+C)
9 SIGKILL Matar el proceso inmediatamente (no puede ignorarse)
15 SIGTERM Terminar el proceso de forma ordenada (por defecto)
18 SIGCONT Reanudar un proceso detenido
19 SIGSTOP Detener el proceso (no puede ignorarse)
20 SIGTSTP Detener desde teclado (Ctrl+Z)
Puedes ver la lista completa con:
$ kill -l
kill — Enviar señal a un proceso por PID
Envía una señal a un proceso identificado por su PID. Por defecto envía SIGTERM (15), que pide al proceso
que termine limpiamente.
Ejemplos:
$ kill 1234 # envía SIGTERM al proceso con PID 1234
$ kill -9 1234 # envía SIGKILL (forzado e inmediato)
$ kill -1 1234 # envía SIGHUP (recarga configuración)
$ kill -SIGTERM 1234 # equivalente a kill 1234
Diferencia entre SIGTERM y SIGKILL:
SIGTERM (15)→ el proceso puede capturar la señal, guardar estado y terminar limpiamente-
SIGKILL (9)→ el kernel mata el proceso directamente, sin que pueda reaccionar. Usar como último recurso
killall — Enviar señal a todos los procesos con un nombre
A diferencia de kill, no requiere el PID. Envía la señal a todos los procesos cuyo nombre
coincida con el indicado.
Ejemplos:
# killall nginx # envía SIGTERM a todos los procesos nginx
# killall -9 firefox # fuerza el cierre de todos los firefox
# killall -u juan bash # mata todos los bash del usuario juan
Opciones comunes:
-u→ limitar a procesos de un usuario concreto-i→ pedir confirmación antes de matar cada proceso-q→ no mostrar error si no hay procesos con ese nombre
pkill — Enviar señal por patrón de nombre
Similar a killall pero acepta expresiones regulares y tiene más opciones de filtrado, como el usuario
o el grupo propietario del proceso.
Ejemplos:
$ pkill nginx # mata procesos que se llamen nginx
$ pkill -u juan # mata todos los procesos del usuario juan
$ pkill -9 -u juan bash # fuerza cierre de bash del usuario juan
$ pkill -HUP nginx # envía SIGHUP (recarga config) a nginx
Opciones comunes:
-u→ filtrar por usuario-g→ filtrar por grupo-t→ filtrar por terminal-n→ afectar solo al proceso más reciente con ese nombre-o→ afectar solo al proceso más antiguo con ese nombre
Control de trabajos en segundo plano
Desde la shell también puedes mover procesos entre primer y segundo plano usando señales implícitas.
$ sleep 100 & # lanzar en segundo plano
$ jobs # listar trabajos en segundo plano
$ fg %1 # traer el trabajo 1 al primer plano
$ bg %1 # reanudar el trabajo 1 en segundo plano
Ctrl+Z # enviar SIGTSTP: pausar proceso en primer plano
Ctrl+C # enviar SIGINT: interrumpir proceso en primer plano