Jeśli jesteś użytkownikiem Linuksa, być może widziałeś procesy zombie, które krążyły wokół twojej listy procesów. Nie możesz zabić procesu zombie, ponieważ jest już martwy - jak prawdziwy zombie.
Zombie są w zasadzie resztkami martwych procesów, które nie zostały odpowiednio oczyszczone. Program, który tworzy procesy zombie, nie jest właściwie zaprogramowany - programy nie powinny pozwalać procesom zombie trzymać się z daleka.
Zdjęcie: Daniel Hollister na Flickr (Remixed)
Aby zrozumieć, czym jest proces zombie i co powoduje pojawianie się procesów zombie, musisz zrozumieć nieco, jak działają procesy w systemie Linux.
Kiedy proces umiera na Linuksie, nie wszystkie są natychmiast usuwane z pamięci - deskryptor procesu pozostaje w pamięci (deskryptor procesu zajmuje tylko niewielką ilość pamięci). Status procesu staje się EXIT_ZOMBIE, a rodzic nadrzędny procesu zostaje powiadomiony, że jego proces potomny zginął wraz z sygnałem SIGCHLD. Proces macierzysty powinien następnie wykonać wywołanie systemowe wait (), aby odczytać status wyjścia martwego procesu i inne informacje. Dzięki temu proces nadrzędny może uzyskać informacje z martwego procesu. Po wywołaniu wait () proces zombie zostaje całkowicie usunięty z pamięci.
Zwykle dzieje się to bardzo szybko, więc nie zobaczysz procesów zombie gromadzących się w twoim systemie. Jeśli jednak proces nadrzędny nie jest właściwie zaprogramowany i nigdy nie wywoła funkcji wait (), jego dzieci zombie będą się trzymać w pamięci, dopóki nie zostaną oczyszczone.
Narzędzia takie jak Monitor systemu GNOME, Top polecenie i ps polecenia wyświetlają procesy zombie.
Procesy zombie nie zużywają żadnych zasobów systemowych. (W rzeczywistości każdy używa bardzo niewielkiej ilości pamięci systemowej do przechowywania swojego deskryptora procesu.) Jednak każdy proces zombie zachowuje swój identyfikator procesu (PID). Systemy Linux mają skończoną liczbę identyfikatorów procesów - 32767 domyślnie w systemach 32-bitowych. Jeśli zombie gromadzą się w bardzo szybkim tempie - na przykład, jeśli niewłaściwie zaprogramowane oprogramowanie serwera tworzy procesy zombie pod obciążeniem - cała pula dostępnych PID zostanie ostatecznie przypisana do procesów zombie, zapobiegając uruchomieniu innych procesów.
Jednak kilka procesów zombie kręcących się nie stanowi problemu - mimo że wskazują na błąd związany z procesem nadrzędnym w systemie.
Nie możesz zabijać procesów zombie, ponieważ możesz zabić normalne procesy sygnałem SIGKILL - procesy zombie są już martwe. Pamiętaj, że nie musisz pozbywać się procesów zombie, chyba że masz dużą część systemu - kilka zombie jest nieszkodliwych. Istnieje jednak kilka sposobów na pozbycie się procesów zombie.
Jednym ze sposobów jest wysłanie sygnału SIGCHLD do procesu macierzystego. Ten sygnał mówi procesowi nadrzędnemu, aby wykonał wywołanie systemowe wait () i oczyścił jego dzieci zombie. Wyślij sygnał za pomocą zabić polecenie, zastępując pid w poniższym poleceniu z PID procesu nadrzędnego:
kill -s SIGCHLD pid
Jeśli jednak proces nadrzędny nie jest prawidłowo zaprogramowany i ignoruje sygnały SIGCHLD, to nie pomoże. Musisz zabić lub zamknąć proces nadrzędny zombie. Kiedy proces, który zakończył zombie, zakończy się, init dziedziczy procesy zombie i staje się ich nowym rodzicem. (init jest pierwszym procesem uruchomionym na Linuksie podczas rozruchu i ma przypisany PID 1.) init okresowo wykonuje wywołanie systemowe wait (), aby oczyścić swoje dzieci zombie, więc init wykona krótką pracę zombie. Możesz ponownie uruchomić proces nadrzędny po jego zamknięciu.
Jeśli proces nadrzędny kontynuuje tworzenie zombie, powinien zostać naprawiony, aby poprawnie wywoływał funkcję wait (), aby zebrać swoje dzieci zombie. Zgłoś błąd, jeśli program w twoim systemie nadal tworzy zombie.