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
          

Las señales son el mecanismo fundamental de control de procesos en Linux.

Systemd: servicios con systemctl

Índice de la sección

Índice del curso