Qué es una señal
Una señal es un mensaje de una palabra que el kernel entrega a un proceso: «el terminal se cerró», «tocaste memoria inválida», «por favor, para». El proceso puede instalar un manejador para la mayoría, ignorarlas o aceptar la acción por defecto, que suele ser terminar (a veces con volcado de memoria). Dos no pueden capturarse ni ignorarse: SIGKILL acaba con el proceso en el acto y SIGSTOP lo congela.
TERM frente a KILL
kill PID envía SIGTERM: una petición. Un programa bien escrito la captura, termina la petición en curso, vuelca los archivos, cierra las conexiones y sale; eso es lo que systemd, Docker y Kubernetes envían primero. kill -9 envía SIGKILL: el kernel elimina el proceso sin ejecutar nada de su código, así que los bloqueos siguen tomados, los archivos temporales se quedan y las escrituras en curso se pierden. Úsalo solo después de que TERM haya tenido tiempo (systemd espera TimeoutStopSec, Docker 10 segundos por defecto) y haya fallado.
Las señales como API
- SIGHUP: los demonios recargan su configuración (nginx, sshd, HAProxy con semántica
-sfmediante systemd reload). Para un proceso en primer plano significa que el terminal se fue;nohupla ignora. - SIGUSR1 / SIGUSR2: definidas por el programa. nginx reabre los registros con USR1 y actualiza su binario con USR2;
ddimprime el progreso con USR1; Gunicorn y Unicorn las usan para reinicios suaves. - SIGPIPE: escribir en una tubería cuyo lector ha terminado. Su acción por defecto, terminar, es la razón por la que
yes | headacaba y por la que los servidores deben ignorarla o manejar los errores de escritura. - SIGCHLD: un hijo terminó; los padres recogen a los hijos con
wait(), y un padre que no lo hace deja zombis. - SIGWINCH: el terminal cambió de tamaño; los editores y multiplexores redibujan.
Enviar señales
kill -TERM 1234 # por nombre (o kill -15 1234)
kill -s USR1 $(pidof nginx)
pkill -HUP sshd # por nombre de proceso
killall -9 runaway # todos los procesos con ese nombre
systemctl kill -s HUP myservice
docker kill --signal=SIGUSR1 container Los números 1–15 son iguales en todos los Unix; por encima difieren según la arquitectura (SIGUSR1 es 10 en x86 y 30 en SPARC/MIPS), por eso los scripts deberían usar nombres.
Preguntas
¿Cuál es la diferencia entre SIGTERM y SIGKILL?
SIGTERM pide al proceso que salga y puede manejarse; SIGKILL lo termina de inmediato y no puede capturarse. Prueba siempre TERM primero; KILL es para procesos atascados.
¿Qué es la señal 11 / SIGSEGV?
Un fallo de segmentación: el programa leyó o escribió memoria que no le pertenece, normalmente un puntero nulo o colgante en código C/C++ o un fallo en una extensión nativa. La shell informa del código de salida 139.
¿Por qué mi proceso salió con 137 si nadie ejecutó kill -9?
Lo hizo el kernel: el out-of-memory killer envía SIGKILL al proceso más grande cuando se acaba la memoria, y los runtimes de contenedores hacen lo mismo cuando se alcanza un límite de memoria. Comprueba dmesg o el indicador OOMKilled del contenedor.
¿Puedo ignorar SIGINT para que Ctrl-C no pare mi script?
Sí: trap "" INT en bash, o signal.signal(SIGINT, SIG_IGN) en Python. Normalmente es mejor capturarla y limpiar antes de salir, para que el usuario aún pueda parar el script.