bitlvl
DE

Linux-Signal-Referenz

Tippen Sie einen Namen oder eine Nummer, um ein Signal zu finden. Die letzte Spalte ist der Exit-Code, den eine Shell meldet, wenn ein Prozess an diesem Signal stirbt (128 + Nummer). Die Tabelle ist auf Englisch.

 
Nr.NameStandardBedeutung / UrsacheExit-Code
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

Die Ergebnisse und Meldungen dieses Tools werden auf Englisch angezeigt.

Was ein Signal ist

Ein Signal ist eine Ein-Wort-Nachricht, die der Kernel an einen Prozess zustellt: „das Terminal wurde geschlossen“, „du hast ungültigen Speicher berührt“, „bitte anhalten“. Der Prozess kann für die meisten einen Handler installieren, sie ignorieren oder die Standardaktion akzeptieren, die meist Beenden ist (manchmal mit Core-Dump). Zwei lassen sich weder abfangen noch ignorieren: SIGKILL beendet den Prozess sofort, und SIGSTOP friert ihn ein.

TERM gegen KILL

kill PID sendet SIGTERM: eine Bitte. Ein gut geschriebenes Programm fängt es ab, beendet die aktuelle Anfrage, schreibt Dateien, schließt Verbindungen und beendet sich; das senden systemd, Docker und Kubernetes zuerst. kill -9 sendet SIGKILL: Der Kernel entfernt den Prozess, ohne dessen Code auszuführen, also bleiben Locks gehalten, temporäre Dateien liegen, und laufende Schreibvorgänge gehen verloren. Nutzen Sie es nur, nachdem TERM Zeit hatte (systemd wartet TimeoutStopSec, Docker standardmäßig 10 Sekunden) und gescheitert ist.

Signale als API

  • SIGHUP: Daemons laden ihre Konfiguration neu (nginx, sshd, HAProxy mit -sf-Semantik über systemd reload). Für einen Vordergrundprozess heißt es, das Terminal ist weg; nohup ignoriert es.
  • SIGUSR1 / SIGUSR2: programmdefiniert. nginx öffnet Logs bei USR1 neu und aktualisiert sein Binary bei USR2; dd gibt bei USR1 den Fortschritt aus; Gunicorn und Unicorn nutzen sie für sanfte Neustarts.
  • SIGPIPE: Schreiben in eine Pipe, deren Leser beendet ist. Seine Standardaktion, Beenden, ist der Grund, warum yes | head endet und warum Server es ignorieren oder Schreibfehler behandeln müssen.
  • SIGCHLD: Ein Kindprozess ist beendet; Eltern räumen Kinder mit wait() ab, und ein Elternprozess, der das nicht tut, hinterlässt Zombies.
  • SIGWINCH: Das Terminal wurde in der Größe geändert; Editoren und Multiplexer zeichnen neu.

Signale senden

kill -TERM 1234        # per Name (oder kill -15 1234)
kill -s USR1 $(pidof nginx)
pkill -HUP sshd        # per Prozessname
killall -9 runaway     # alle Prozesse mit diesem Namen
systemctl kill -s HUP myservice
docker kill --signal=SIGUSR1 container

Die Nummern 1–15 sind auf jedem Unix gleich; darüber unterscheiden sie sich nach Architektur (SIGUSR1 ist 10 auf x86 und 30 auf SPARC/MIPS), weshalb Skripte Namen verwenden sollten.

Fragen

Was ist der Unterschied zwischen SIGTERM und SIGKILL?

SIGTERM bittet den Prozess, sich zu beenden, und kann behandelt werden; SIGKILL beendet ihn sofort und lässt sich nicht abfangen. Versuchen Sie immer zuerst TERM; KILL ist für festhängende Prozesse.

Was ist Signal 11 / SIGSEGV?

Ein Segmentation Fault: Das Programm hat Speicher gelesen oder geschrieben, der ihm nicht gehört, meist ein Null- oder hängender Zeiger in C/C++-Code oder ein Fehler in einer nativen Erweiterung. Die Shell meldet Exit-Code 139.

Warum endete mein Prozess mit 137, obwohl niemand kill -9 ausgeführt hat?

Der Kernel hat es getan: Der Out-of-Memory-Killer sendet SIGKILL an den größten Prozess, wenn der Speicher ausgeht, und Container-Laufzeiten tun dasselbe, wenn ein Speicherlimit erreicht ist. Prüfen Sie dmesg oder das OOMKilled-Flag des Containers.

Kann ich SIGINT ignorieren, damit Strg-C mein Skript nicht stoppt?

Ja: trap "" INT in bash oder signal.signal(SIGINT, SIG_IGN) in Python. Meist ist es besser, es abzufangen und vor dem Beenden aufzuräumen, damit der Benutzer das Skript trotzdem stoppen kann.