Proces zombie w systemie Linux to proces, który zakończył swoje działanie, ale nadal widnieje w tablicy procesów, ponieważ jego proces nadrzędny nie odebrał jeszcze statusu zakończenia potomka. Zwykle są to efekty błędów programowania, jednak ich nagromadzenie może prowadzić do spowolnienia lub niestabilności systemu.
Czym jest proces zombie?
- Proces zombie (znany też jako defunct process) to taki, który przeszedł przez funkcję
exit()
, ale wciąż posiada wpis w tablicy procesów, ponieważ rodzic nie odebrał jego statusu za pomocą funkcjiwait()
lubwaitpid()
. - Nie używają już zasobów systemowych jak pamięć czy CPU, ale zachowują PID i wpis w tabeli.
- Jeżeli proces nadrzędny również zakończy się, zanim „posprząta” po potomku, to potomka adoptuje proces
init
(PID 1), który odbierze status i ostatecznie usunie go z tablicy.
Jak rozpoznać procesy zombie w Ubuntu?
1. Wyświetlanie procesów zombie w terminalu
Aby wyszukać procesy zombie, użyj jednej z poniższych metod:
- Przy pomocy ps i grep –
ps aux | awk '{ print $8 " " $2 }' | grep -w Z
Lub bardziej czytelnie:
ps aux | egrep "Z|defunct" | grep -v 'grep'
Status Z
oznacza proces zombie.
-
W aplikacji top –
Uruchom polecenie:
top
W kolumnie STAT
znajdziesz procesy oznaczone literą Z
.
Jak zakończyć proces zombie w Ubuntu? Instrukcja krok po kroku
Krok 1 – Zidentyfikuj procesy zombie
W terminalu wpisz:
ps -ef | grep defunct
lub
ps aux | awk '{ print $8 " " $2 }' | grep -w Z
Wynik zwróci linie z PID procesów w stanie zombie.
Krok 2 – Znajdź PID procesu nadrzędnego (PPID)
Każdy proces zombie ma swój nadrzędny proces (rodzica), który nie odebrał kodu zakończenia.
Wyświetl szczegóły procesu zombie wraz z PPID:
ps -A -ostat,ppid,pid,cmd | grep -e '[Zz]'
Przykładowy wynik:
Z 1234 5678 [defunct]
Gdzie 1234 to PPID (PID procesu rodzica), 5678 to PID procesu zombie.
Krok 3 – Wyślij sygnał SIGCHLD do procesu nadrzędnego
By wymusić odebranie statusu zakończenia przez rodzica (jeśli nadal działa), wyślij sygnał SIGCHLD –
kill -s SIGCHLD <PPID>
Przykład:
kill -s SIGCHLD 1234
Jeśli proces rodzica zareaguje, status potomka zostanie odebrany, a wpis procesu zombie zniknie z systemu.
Krok 4 – Jeśli to nie pomaga – zakończ proces rodzica
Jeżeli wysłanie sygnału nie rozwiązało problemu (np. gdy proces rodzica nie reaguje lub jest uszkodzony), pozostaje zakończyć proces rodzica komendą:
kill -9 <PPID>
Uwaga! Zakończenie procesu rodzica może spowodować niepożądane skutki w działaniu aplikacji/systemu.
Po zakończeniu procesu rodzica, procesy zombie zostaną przekazane do procesu init
, który je posprząta.
Niezbędne informacje i wyjaśnienia
-
Procesy zombie sporadyczne – Jeden lub dwa to normalne zjawisko i nie stanowią problemu.
-
Nadmierna liczba zombie – Nagromadzenie wielu procesów zombie oznacza błąd w kodzie programu lub poważniejszy problem i wymaga interwencji.
-
Zapobieganie zombie – Własne skrypty i programy powinny zawsze obsługiwać sygnały zakończenia dzieci (
SIGCHLD
) i wywoływaćwait()
/waitpid()
.
Podsumowanie – co warto zapamiętać?
- Proces zombie to niedokończony etap sprzątania po procesie potomnym.
- Najczęściej usuwane są automatycznie po odebraniu statusu przez rodzica.
- W przypadku wielu zombie należy zdiagnozować i naprawić źródło problemu w kodzie aplikacji/process-handling.
- Poskramianie zombie polega na wysyłce sygnału lub zakończeniu procesu rodzica.
Ten poradnik można dowolnie publikować na serwisie tematycznym poświęconym Linux.