Procesy zombie w systemie Linux: Znajdź, usuń, zapobiegaj
15 min czytania - 19 maja 2026

Dowiedz się, jak identyfikować, usuwać i zapobiegać procesom zombie w systemie Linux. Polecenia, poprawki kodu i wskazówki dotyczące monitorowania dla administratorów serwerów.
Procesy zombie w systemie Linux: jak je znaleźć i usunąć
Proces zombie to proces potomny, który zakończył wykonywanie, ale nadal zajmuje miejsce w tabeli procesów jądra. Istnieje, ponieważ proces nadrzędny nie wywołał wait() , aby pobrać jego status zakończenia. Procesy zombie nie zużywają mocy procesora ani pamięci, ale każdy z nich zajmuje identyfikator PID. Jeśli zgromadzi się ich wystarczająco dużo, system nie będzie mógł uruchamiać nowych procesów. W tym poście omówiono, jak je wykrywać, usuwać i zapobiegać ich pojawianiu się.
Dlaczego procesy zombie mają znaczenie na serwerach
Pojedynczy proces zombie jest nieszkodliwy. Problem pojawia się, gdy się kumulują. System Linux ma ograniczoną przestrzeń PID: 32 768 w systemach 32-bitowych i do 4 194 304 w systemach 64-bitowych. Jeśli procesy zombie zapełnią tabelę procesów, jądro nie będzie mogło tworzyć nowych procesów. Oznacza to brak nowych połączeń, nowych wątków roboczych i wszelkich innych nowych elementów.
Serwery WWW, takie jak Apache i Nginx, są szczególnie narażone, ponieważ tworzą procesy potomne w celu obsługi ruchu. Testy porównawcze wykazały 48-procentowy spadek przepustowości, gdy procesy zombie gromadzą się na obciążonym serwerze WWW. W 2019 r. wyciek kanału Golang w podzie DNS Kubernetes spowodował powstanie ponad 26 000 procesów zombie na jednym węźle, wypełniając tabelę procesów i powodując awarię rozpoznawania DNS w całym klastrze.
Poniższa tabela przedstawia kluczowe różnice między normalnym procesem a zombie:
| Cechy | Normalny proces | Proces zombie |
|---|---|---|
| Symbol stanu | R, S, D lub T | Z (nieaktywny) |
| CPU / Pamięć | Aktywne wykorzystanie | 0% / 0 (już zakończone) |
| Wpis w tabeli procesów | Jedno gniazdo | Jedno miejsce |
Odpowiedź na kill -9 | Zakończenie natychmiastowe | Brak efektu (już nieaktywny) |
| Pamięć jądra | Pełny deskryptor procesu | Tylko minimalny status wyjścia |
Najważniejszy wniosek: nie można kill -9 zombie. Jest już martwy. Jedynym sposobem na jego usunięcie jest zmuszenie procesu nadrzędnego do jego zebrania lub zabicie procesu nadrzędnego, aby init (PID 1) odziedziczył i zlikwidował go automatycznie.
Jak znaleźć procesy zombie
Procesy zombie są oznaczone literą Z w kolumnie STAT oraz <defunct> obok nazwy polecenia. Wyświetl je za pomocą:
ps aux | grep -w ZAby wyświetlić identyfikator procesu nadrzędnego (PPID), który będzie potrzebny do usunięcia:
ps -eo pid,ppid,stat,comm | grep -w ZPolecenie top polecenie podaje również całkowitą liczbę procesów zombie w linii nagłówkowej. Aby przeprowadzić szybką, nieinteraktywną kontrolę:
top -bn1 | grep zombieŚledzenie procesu nadrzędnego za pomocą pstree
Gdy już masz PID procesu zombie, prześledź go wstecz do odpowiedzialnego procesu nadrzędnego:
pstree -p -s <zombie_pid>To pokazuje pełne drzewo pochodzenia od init aż do procesu zombie. Jeśli pstree nie jest zainstalowane, ps auxf wyświetla podobny widok drzewa w formacie ASCII.
Liczenie zombie do monitorowania
Czysta liczba, która wyklucza sam proces grep:
ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'Do ciągłego monitorowania podczas rozwiązywania problemów:
watch -n 1 'ps aux | grep -w Z | wc -l'Jak usunąć procesy zombie
Procesy zombie można usunąć jedynie poprzez zebranie ich statusu wyjścia. Oznacza to działanie poprzez proces nadrzędny.
1. Znajdź proces nadrzędny.
ps -o ppid= -p <zombie_pid>2. Wyślij sygnał do procesu nadrzędnego, aby zlikwidował swoje procesy potomne.
kill -SIGCHLD <parent_pid>To nakazuje procesowi nadrzędnemu wywołanie wait() w przypadku wszystkich zakończonych procesów potomnych. Jest to metoda niepowodująca zakłóceń i działa w przypadku poprawnie działających aplikacji.
3. Jeśli SIGCHLD nie zadziała, uruchom ponownie usługę.
systemctl restart <service_name>4. Jeśli proces nadrzędny nie odpowiada, zabij go.
kill <parent_pid>Lub jeśli ignoruje sygnał SIGTERM:
kill -9 <parent_pid>Gdy proces nadrzędny umiera, init (PID 1) lub systemd przyjmuje osierocone procesy zombie i natychmiast je usuwa. Zachowaj ostrożność w systemach produkcyjnych. Zakończenie działania procesu nadrzędnego powoduje również zakończenie działania wszystkich jego aktywnych procesów potomnych.
5. Sprawdź, czy wszystko zostało wyczyszczone.
ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'Jeśli liczba wynosi 0, wszystko jest w porządku.
Zapobieganie procesom zombie
Obsługa procesów potomnych w kodzie
Główną przyczyną powstawania większości procesów zombie jest proces nadrzędny, który nigdy nie wywołuje wait(). Napraw to u źródła:
- C: Ustaw
signal(SIGCHLD, SIG_IGN);, aby automatycznie odrzucać informacje o zakończeniu procesu potomnego, lub użyj obsługi sygnałów zwaitpid(-1, NULL, WNOHANG)do asynchronicznego zbierania. - Python: Użyj
subprocess.run(), która czeka automatycznie. Jeśli używaszPopen, wywołajproc.wait()wyraźnie. - Bash: Dodaj
waitna końcu skryptów uruchamiających zadania w tle.
Skonfiguruj systemd prawidłowo
W przypadku usług zarządzanych przez systemd te ustawienia zapobiegają gromadzeniu się procesów zombie:
KillMode=control-groupzapewnia, że wszystkie procesy potomne zostaną zakończone razem, gdy usługa się zatrzyma.TimeoutStopSecdaje procesowi nadrzędnemu czas na zebranie procesów potomnych, zanim systemd wyśle sygnał SIGKILL.WatchdogSecautomatycznie restartuje usługi, które nie odpowiadają, wychwytując przypadki, w których proces nadrzędny zawiesza się i przestaje usuwać procesy potomne.
Monitoruj tabelę procesów
Skonfiguruj zadanie cron, które będzie uruchamiane co 15 minut w celu zliczania procesów zombie i ostrzegania, jeśli liczba ta przekroczy próg:
ps aux | awk '$8 ~ /Z/' | wc -lMonitoruj również wykorzystanie tabeli procesów, porównując aktualną liczbę z /proc/sys/kernel/pid_max. Jeśli przekroczy 80%, zbadaj sprawę, zanim stanie się to problemem. Kilka przejściowych procesów zombie podczas normalnej pracy nie jest powodem do obaw. Rosnąca liczba, która nie spada z powrotem do zera, wskazuje na błąd aplikacji, który wymaga naprawy.
Wniosek
Procesy zombie to martwe procesy, które nie zostały usunięte. Nie zużywają one procesora ani pamięci, ale zajmują identyfikatory PID, a pełna tabela procesów uniemożliwia serwerowi wykonywanie jakichkolwiek użytecznych czynności.
- Znajdź je za pomocą
ps aux | grep -w Zi wyśledź proces nadrzędny za pomocąpstree. - Usuń je, wysyłając
SIGCHLDdo procesu nadrzędnego, restartując usługę lub, w ostateczności, zabijając proces nadrzędny. - Zapobiegaj im, pisząc kod, który wywołuje
wait(), poprawnie konfigurując systemd i monitorując tabelę procesów.
Jeśli obsługujesz obciążenia o dużym natężeniu ruchu i potrzebujesz niezawodnej infrastruktury z pełnym dostępem do uprawnień administratora, serwery dedykowane FDC zapewniają pełną kontrolę nad zarządzaniem procesami i konfiguracją systemu.

Procesy zombie w systemie Linux: Znajdź, usuń, zapobiegaj
Dowiedz się, jak identyfikować, usuwać i zapobiegać procesom zombie w systemie Linux. Polecenia, poprawki kodu i wskazówki dotyczące monitorowania dla administratorów serwerów.
15 min czytania - 19 maja 2026
Lista kontrolna zabezpieczania serwerów Linux
15 min czytania - 8 maja 2026

Masz pytania lub potrzebujesz niestandardowego rozwiązania?
Elastyczne opcje
Globalny zasięg
Natychmiastowe wdrożenie
Elastyczne opcje
Globalny zasięg
Natychmiastowe wdrożenie