Zombie-Prozesse in Linux: Finden, Entfernen, Verhindern

15 Min. Lesezeit - 19. Mai 2026

hero section cover
Inhaltsverzeichnis
  • Zombie-Prozesse unter Linux: So finden und entfernen Sie sie
  • Warum Zombie-Prozesse auf Servern eine Rolle spielen
  • So finden Sie Zombie-Prozesse
  • So entfernen Sie Zombie-Prozesse
  • Zombie-Prozesse verhindern
  • Fazit
Teilen

Lernen Sie, wie Sie Zombie-Prozesse in Linux identifizieren, entfernen und verhindern können. Befehle, Codekorrekturen und Überwachungstipps für Serveradministratoren.

Zombie-Prozesse unter Linux: So finden und entfernen Sie sie

Ein Zombie-Prozess ist ein untergeordneter Prozess, der seine Ausführung beendet hat, aber weiterhin einen Platz in der Prozesstabelle des Kernels belegt. Er existiert, weil der übergeordnete Prozess nicht wait() , um seinen Exit-Status abzurufen. Zombies verbrauchen weder CPU-Leistung noch Arbeitsspeicher, aber jeder von ihnen belegt eine PID. Sammeln sich genug davon an, kann Ihr System keine neuen Prozesse mehr starten. Dieser Beitrag behandelt, wie man sie erkennt, entfernt und von vornherein verhindert, dass sie überhaupt erst entstehen.


 

Warum Zombie-Prozesse auf Servern eine Rolle spielen

Ein einzelner Zombie ist harmlos. Das Problem beginnt, wenn sie sich ansammeln. Linux verfügt über einen begrenzten PID-Raum: 32.768 auf 32-Bit-Systemen, bis zu 4.194.304 auf 64-Bit-Systemen. Wenn Zombie-Prozesse die Prozesstabelle füllen, kann der Kernel keine neuen Prozesse erstellen. Das bedeutet: keine neuen Verbindungen, keine neuen Worker-Threads, nichts Neues.

Webserver wie Apache und Nginx sind besonders gefährdet, da sie Child-Prozesse forken, um den Datenverkehr zu bewältigen. Benchmarks haben einen Durchsatzrückgang von 48 % gezeigt, wenn sich Zombies auf einem stark ausgelasteten Webserver ansammeln. Im Jahr 2019 verursachte ein Golang-Channel-Leak in einem Kubernetes-DNS-Pod über 26.000 Zombies auf einem einzelnen Knoten, füllte die Prozesstabelle und führte zu einem clusterweiten Absturz der DNS-Auflösung.

Die folgende Tabelle zeigt die wichtigsten Unterschiede zwischen einem normalen Prozess und einem Zombie:

MerkmalNormaler ProzessZombie-Prozess
ZustandssymbolR, S, D oder TZ (inaktiv)
CPU / SpeicherAktive Nutzung0 % / 0 (bereits beendet)
Eintrag in der ProzesstabelleEin SteckplatzEin Slot
Reaktion auf kill -9Wird sofort beendetKeine Auswirkung (bereits beendet)
Kernel-SpeicherVollständiger ProzessdeskriptorNur minimaler Exit-Status

Die entscheidende Erkenntnis: Man kann kill -9 einen Zombie. Er ist bereits tot. Die einzige Möglichkeit, ihn zu beseitigen, besteht darin, den Elternprozess ihn abräumen zu lassen oder den Elternprozess zu beenden, damit init (PID 1) ihn automatisch erbt und bereinigt.

So finden Sie Zombie-Prozesse

Zombies werden mit einem Z in der Spalte STAT und <defunct> neben dem Befehlsnamen. Listen Sie sie mit folgendem Befehl auf:

ps aux | grep -w Z

Um die ID des übergeordneten Prozesses (PPID) anzuzeigen, die Sie zum Entfernen benötigen:

ps -eo pid,ppid,stat,comm | grep -w Z

Der top Befehl gibt in seiner Kopfzeile auch die Gesamtzahl der Zombies an. Für eine schnelle, nicht-interaktive Überprüfung:

top -bn1 | grep zombie

Den Elternprozess mit pstree aufspüren

Sobald Sie die PID eines Zombies haben, verfolgen Sie diese zurück zum verantwortlichen Elternprozess:

pstree -p -s <zombie_pid>

Dies zeigt die vollständige Abstammungslinie init bis hinunter zum Zombie. Falls pstree nicht installiert ist, ps auxf liefert eine ähnliche ASCII-Baumansicht.

Zombies zur Überwachung zählen

Eine bereinigte Zählung, die den grep-Prozess selbst ausschließt:

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Für die kontinuierliche Überwachung während der Fehlerbehebung:

watch -n 1 'ps aux | grep -w Z | wc -l'

So entfernen Sie Zombie-Prozesse

Zombies können nur entfernt werden, indem ihr Exit-Status erfasst wird. Das bedeutet, dass man über den Elternprozess vorgehen muss.

1. Finden Sie den Elternprozess.

ps -o ppid= -p <zombie_pid>

2. Geben Sie dem Elternprozess ein Signal, seine Kinder zu beenden.

kill -SIGCHLD <parent_pid>

Dadurch wird der Elternprozess angewiesen, wait() für alle beendeten Kinder aufzurufen. Dies ist unterbrechungsfrei und funktioniert bei gut funktionierenden Anwendungen.

3. Wenn SIGCHLD nicht funktioniert, starte den Dienst neu.

systemctl restart <service_name>

4. Wenn der Elternprozess nicht reagiert, beende ihn.

kill <parent_pid>

Oder wenn er SIGTERM ignoriert:

kill -9 <parent_pid>

Wenn der Elternprozess stirbt, init (PID 1) oder systemd die verwaisten Zombies und räumt sie sofort auf. Seien Sie bei Produktionssystemen vorsichtig. Das Beenden des Elternprozesses beendet auch alle seine aktiven Kinderprozesse.

5. Überprüfe die Bereinigung.

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Wenn der Zählerstand 0 ist, ist alles in Ordnung.

Zombie-Prozesse verhindern

Behandeln Sie untergeordnete Prozesse in Ihrem Code

Die Hauptursache für die meisten Zombie-Ansammlungen ist ein Elternprozess, der niemals wait(). Beheben Sie das Problem an der Quelle:

  • C: Setzen Sie signal(SIGCHLD, SIG_IGN); so ein, dass Informationen zum Beenden von Kindprozessen automatisch verworfen werden, oder verwenden Sie einen Signal-Handler mit waitpid(-1, NULL, WNOHANG) , um asynchron zu bereinigen.
  • Python: Verwenden Sie subprocess.run(), das automatisch wartet. Bei Verwendung von Popen, rufen Sie proc.wait() explizit auf.
  • Bash: Fügen Sie wait am Ende von Skripten, die Hintergrundaufträge starten.

Konfigurieren Sie systemd ordnungsgemäß

Bei von systemd verwalteten Diensten verhindern diese Einstellungen die Bildung von Zombie-Prozessen:

  • KillMode=control-group stellt sicher, dass alle untergeordneten Prozesse gemeinsam beendet werden, wenn der Dienst stoppt.
  • TimeoutStopSec gibt dem Elternprozess Zeit, die Kindprozesse zu bereinigen, bevor systemd ein SIGKILL sendet.
  • WatchdogSec startet nicht reagierende Dienste automatisch neu und fängt Fälle ab, in denen der Elternprozess hängt und das Aufräumen einstellt.

Überwachen Sie Ihre Prozesstabelle

Richten Sie einen Cron-Job ein, der alle 15 Minuten ausgeführt wird, um Zombies zu zählen und eine Warnung auszugeben, wenn die Anzahl einen Schwellenwert überschreitet:

ps aux | awk '$8 ~ /Z/' | wc -l

Überwachen Sie außerdem die Auslastung Ihrer Prozesstabelle, indem Sie die aktuelle Anzahl mit /proc/sys/kernel/pid_max. Wenn sie 80 % überschreitet, sollten Sie der Sache nachgehen, bevor es zu einem Problem wird. Ein paar vorübergehende Zombies während des normalen Betriebs sind kein Grund zur Sorge. Eine steigende Anzahl, die nicht wieder auf Null zurückfällt, deutet auf einen Anwendungsfehler hin, der behoben werden muss.

Fazit

Zombie-Prozesse sind tote Prozesse, die nicht bereinigt wurden. Sie beanspruchen zwar keine CPU-Leistung oder Speicher, belegen jedoch PIDs, und eine volle Prozesstabelle hindert Ihren Server daran, irgendetwas Sinnvolles zu tun.

  • Finden Sie sie mit ps aux | grep -w Z und verfolgen Sie den Elternprozess mit pstree.
  • Entfernen Sie sie, indem Sie SIGCHLD an den Elternprozess, durch einen Neustart des Dienstes oder als letzten Ausweg durch das Beenden des Elternprozesses.
  • Verhindern Sie sie, indem Sie Code schreiben, der wait(), systemd korrekt konfiguriert und Ihre Prozesstabelle überwacht.

Wenn Sie Workloads mit hohem Datenverkehr ausführen und eine zuverlässige Infrastruktur mit vollständigem Root-Zugriff benötigen, bieten Ihnen die dedizierten Server von FDC die volle Kontrolle über Ihr Prozessmanagement und Ihre Systemkonfiguration.

Blog

Diese Woche im Blickpunkt

Weitere Artikel
Zombie-Prozesse in Linux: Finden, Entfernen, Verhindern

Zombie-Prozesse in Linux: Finden, Entfernen, Verhindern

Lernen Sie, wie Sie Zombie-Prozesse in Linux identifizieren, entfernen und verhindern können. Befehle, Codekorrekturen und Überwachungstipps für Serveradministratoren.

15 Min. Lesezeit - 19. Mai 2026

Checkliste für die Härtung von Linux-Servern

15 Min. Lesezeit - 8. Mai 2026

Weitere Artikel
background image

Haben Sie Fragen oder benötigen Sie eine individuelle Lösung?

icon

Flexible Optionen

icon

Globale Reichweite

icon

Sofortige Bereitstellung

icon

Flexible Optionen

icon

Globale Reichweite

icon

Sofortige Bereitstellung