bitlvl
ES

Referencia de señales de Linux

Escribe un nombre o un número para encontrar una señal. La última columna es el código de salida que informa una shell cuando un proceso muere por esa señal (128 + número). La tabla está en inglés.

 
N.ºNombrePor defectoSignificado / causaCódigo de salida
1SIGHUPTerminateHangup: the controlling terminal closed. Daemons reuse it to mean “reload configuration”.129
2SIGINTTerminateInterrupt from the keyboard (Ctrl-C).130
3SIGQUITCore dumpQuit from the keyboard (Ctrl-\); dumps core.131
4SIGILLCore dumpIllegal instruction.132
5SIGTRAPCore dumpTrace/breakpoint trap (debuggers).133
6SIGABRTCore dumpAbort signal from abort().134
7SIGBUSCore dumpBus error: bad memory access (alignment, mmap).135
8SIGFPECore dumpFloating-point exception, including integer divide by zero.136
9SIGKILLTerminateKill signal. Cannot be caught, blocked or ignored. Last resort; the process gets no chance to clean up.137
10SIGUSR1TerminateUser-defined signal 1. nginx: reopen logs; dd: print progress; Apache: graceful restart.138
11SIGSEGVCore dumpSegmentation fault: invalid memory reference.139
12SIGUSR2TerminateUser-defined signal 2. nginx: binary upgrade; Gunicorn: re-exec.140
13SIGPIPETerminateWrite to a pipe with no reader. Default kills the process, which is why `yes | head` stops.141
14SIGALRMTerminateTimer signal from alarm().142
15SIGTERMTerminateTermination request. The default for kill, systemd stop and docker stop; programs should catch it and shut down cleanly.143
16SIGSTKFLTTerminateStack fault on coprocessor (unused).144
17SIGCHLDIgnoreChild stopped or terminated.145
18SIGCONTContinueContinue if stopped (fg, kill -CONT).146
19SIGSTOPStopStop the process. Cannot be caught or ignored.147
20SIGTSTPStopStop typed at the terminal (Ctrl-Z).148
21SIGTTINStopBackground process tried to read from the terminal.149
22SIGTTOUStopBackground process tried to write to the terminal.150
23SIGURGIgnoreUrgent data on a socket.151
24SIGXCPUCore dumpCPU time limit exceeded.152
25SIGXFSZCore dumpFile size limit exceeded.153
26SIGVTALRMTerminateVirtual alarm clock.154
27SIGPROFTerminateProfiling timer expired.155
28SIGWINCHIgnoreTerminal window size changed.156
29SIGIOTerminateI/O now possible (asynchronous I/O).157
30SIGPWRTerminatePower failure.158
31SIGSYSCore dumpBad system call: the seccomp filter rejected a syscall (systemd SystemCallFilter=, Docker default profile).159

Los resultados y mensajes de esta herramienta se muestran en inglés.

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 -sf mediante systemd reload). Para un proceso en primer plano significa que el terminal se fue; nohup la ignora.
  • SIGUSR1 / SIGUSR2: definidas por el programa. nginx reabre los registros con USR1 y actualiza su binario con USR2; dd imprime 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 | head acaba 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.