Procesy zombie w systemie Linux: Znajdź, usuń, zapobiegaj

15 min czytania - 19 maja 2026

hero section cover
Spis treści
  • Procesy zombie w systemie Linux: jak je znaleźć i usunąć
  • Dlaczego procesy zombie mają znaczenie na serwerach
  • Jak znaleźć procesy zombie
  • Jak usunąć procesy zombie
  • Zapobieganie procesom zombie
  • Wniosek
Udostępnij

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:

CechyNormalny procesProces zombie
Symbol stanuR, S, D lub TZ (nieaktywny)
CPU / PamięćAktywne wykorzystanie0% / 0 (już zakończone)
Wpis w tabeli procesówJedno gniazdoJedno miejsce
Odpowiedź na kill -9Zakończenie natychmiastoweBrak efektu (już nieaktywny)
Pamięć jądraPełny deskryptor procesuTylko 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 Z

Aby wyświetlić identyfikator procesu nadrzędnego (PPID), który będzie potrzebny do usunięcia:

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

Polecenie 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 z waitpid(-1, NULL, WNOHANG) do asynchronicznego zbierania.
  • Python: Użyj subprocess.run(), która czeka automatycznie. Jeśli używasz Popen, wywołaj proc.wait() wyraźnie.
  • Bash: Dodaj wait na 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-group zapewnia, że wszystkie procesy potomne zostaną zakończone razem, gdy usługa się zatrzyma.
  • TimeoutStopSec daje procesowi nadrzędnemu czas na zebranie procesów potomnych, zanim systemd wyśle sygnał SIGKILL.
  • WatchdogSec automatycznie 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 -l

Monitoruj 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 Z i wyśledź proces nadrzędny za pomocą pstree.
  • Usuń je, wysyłając SIGCHLD do 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.

Blog

Polecane w tym tygodniu

Więcej artykułów
Procesy zombie w systemie Linux: Znajdź, usuń, zapobiegaj

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

Więcej artykułów
background image

Masz pytania lub potrzebujesz niestandardowego rozwiązania?

icon

Elastyczne opcje

icon

Globalny zasięg

icon

Natychmiastowe wdrożenie

icon

Elastyczne opcje

icon

Globalny zasięg

icon

Natychmiastowe wdrożenie