Zum Inhalt springen

Signale

Signale sind asynchrone Benachrichtigungen, die das Betriebssystem oder andere Prozesse an einen Prozess schicken. Der Prozess kann sie empfangen, behandeln – oder in den meisten Fällen ignorieren bzw. auf sie reagieren.

Signale sind die Grundlage vieler bekannter Aktionen: Strg+C schickt SIGINT, Strg+Z schickt SIGSTOP, und kill schickt beliebige Signale an beliebige Prozesse.

Nr.NameAuslöserStandardverhalten
1SIGHUPTerminal geschlossen, SSH getrenntBeenden (oder Konfiguration neu laden)
2SIGINTStrg+CBeenden
9SIGKILLkill -9Sofort beenden – nicht abfangbar
15SIGTERMkill (Standard)Sauber beenden
18SIGCONTbg, fgGestoppten Prozess fortsetzen
19SIGSTOPStrg+ZAnhalten – nicht abfangbar
20SIGTSTPStrg+Z (Terminal)Anhalten (abfangbar)

Der Name ist irreführend: kill schickt nicht nur SIGTERM, sondern beliebige Signale. Das Ziel wird per PID angegeben:

Terminal-Fenster
kill 1034 # SIGTERM (15) – sauber beenden
kill -15 1034 # identisch: SIGTERM explizit
kill -TERM 1034 # identisch: Signal per Name
kill -9 1034 # SIGKILL – sofort beenden, kein Aufräumen
kill -HUP 1034 # SIGHUP – Konfiguration neu laden (bei vielen Diensten)

Alle verfügbaren Signale:

Terminal-Fenster
kill -l # Liste aller Signale mit Nummern
SIGTERM (15): Prozess ──► Signal empfangen ──► Aufräumen ──► Beendet
(Dateien schließen,
Verbindungen trennen)
SIGKILL (9): Prozess ──► Kernel beendet Prozess sofort
(kein Aufräumen möglich)

Statt mit der PID kann nach dem Prozessnamen adressiert werden:

Terminal-Fenster
killall nginx # alle Prozesse namens "nginx" beenden (SIGTERM)
killall -9 nginx # alle sofort beenden (SIGKILL)
killall -HUP sshd # sshd neu laden
pkill firefox # Prozesse deren Name "firefox" enthält
pkill -u alice # alle Prozesse von Benutzer alice
pkill -9 -u alice # alle Prozesse von alice sofort beenden
BefehlUnterschied
killall nameExakter Namensvergleich
pkill musterMuster-Match (wie pgrep)

Ein Zombie ist ein Prozess, der bereits beendet ist, aber noch in der Prozesstabelle steht – weil sein Elternprozess den Exit-Code noch nicht abgeholt hat.

Terminal-Fenster
ps aux | grep "Z" # Zombies erkennen (Zustand Z)

Ein Zombie verbraucht keinen Speicher und keine CPU – nur einen Eintrag in der Prozesstabelle. In der Regel ist das harmlos.

Wie entstehen Zombies?

Kindprozess beendet sich
Kernel behält Eintrag (Exit-Code)
▼ Elternprozess ruft wait() auf
Eintrag wird entfernt ──► kein Zombie
│ Elternprozess ruft wait() NICHT auf
Zombie verbleibt in der Prozesstabelle

Was tun bei Zombies?

Ein Zombie selbst lässt sich nicht mit kill entfernen – er ist bereits tot. Die Lösung ist, den Elternprozess zu benachrichtigen:

Terminal-Fenster
# SIGCHLD an den Elternprozess schicken – fordert ihn auf, wait() aufzurufen
kill -CHLD <PPID>

Wenn das nicht hilft, muss der Elternprozess neu gestartet werden. Ist PID 1 (systemd) der Elternprozess, räumt es Zombies automatisch auf.