Zombie process (po polsku „proces zombie” albo „proces defunct”) to proces, który zakończył już swoją pracę, ale wciąż ma wpis w tablicy procesów jądra, bo jego rodzic nie odebrał kodu zakończenia. Mówiąc obrazowo: dziecko umarło, ale system trzyma jego „akt zgonu” tak długo, aż rodzic go odbierze. Taki proces nie wykonuje już żadnego kodu i nie zżera CPU ani pamięci RAM — zajmuje tylko wpis w tablicy procesów (czyli numer PID).
Skąd się to bierze
W Linuksie i innych systemach uniksowych proces potomny tworzy się przez fork(), a kończy przez exit(). Gdy dziecko kończy działanie, jądro nie kasuje go od razu — przechowuje jego status zakończenia, żeby rodzic mógł się dowiedzieć, jak poszło. Rodzic odbiera ten status, wywołując wait() lub waitpid(). Ten moment nazywamy „żęciem” (reaping). Dopóki rodzic tego nie zrobi, dziecko wisi jako zombie.
Zombie powstaje więc nie dlatego, że coś się zepsuło w samym dziecku, tylko dlatego, że rodzic nie posprzątał. To zwykle błąd w kodzie aplikacji, która rozwidla procesy i zapomina o nich. Najczęściej zombie żyje ułamek sekundy i znika — problem zaczyna się, gdy zombie zostają na dłużej i mnożą się.
Jak to wygląda w praktyce
Zombie poznasz po stanie Z (albo opisie defunct) na liście procesów. Sprawdź to tak:
ps aux | grep 'Z'— pokaże procesy w stanie zombie,ps -el | grep Z— w kolumnieSzobaczysz literęZ,- w
topczyhtopmasz licznik zombie w nagłówku.
Klasyczny scenariusz: serwer, który dla każdego połączenia robi fork(), ale nie obsługuje sygnału SIGCHLD i nie wywołuje wait(). Po kilku godzinach masz setki wpisów i w końcu wyczerpujesz limit PID-ów — nowych procesów nie da się odpalić.
Częste mity i pułapki
„Zabiję zombie przez kill -9.” Nie zabijesz — on już nie żyje. Sygnał nie ma kogo zabić. Żeby usunąć zombie, musisz zmusić rodzica do odebrania statusu albo zakończyć rodzica. Gdy rodzic ginie, osierocone zombie adoptuje proces init (PID 1, dziś zwykle systemd), który grzecznie je „zżyna” przez wait() i wpisy znikają.
Drugi mit: że zombie zżerają zasoby. Nie zżerają pamięci ani CPU — jedynym ograniczonym zasobem, który blokują, jest pula numerów PID. Jeśli widzisz jednego–dwóch zombie na chwilę, zignoruj. Jeśli rosną w setki, masz buga w kodzie rodzica i to jego trzeba poprawić (obsługa SIGCHLD + waitpid()).
Pojęcia powiązane
Warto skojarzyć zombie z: orphan process (proces osierocony — żyje, ale stracił rodzica), PID, wywołaniami fork() i wait()/waitpid(), sygnałem SIGCHLD oraz procesem init/systemd jako „sprzątaczem” osieroconych procesów.