20Aug

Co to jest "proces Zombie" na Linuksie?

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 to w zasadzie resztki martwych procesów, które nie zostały właściwie oczyszczone. Program, który tworzy procesy zombie, nie jest właściwie zaprogramowany - programy nie powinny pozwalać procesom zombie trzymać się z daleka.

Image Credit: Daniel Hollister na Flickr( Remixed)

Co to jest proces zombie?

Aby zrozumieć, czym jest proces zombie i co powoduje pojawianie się procesów zombie, musisz trochę zrozumieć, jak działają procesy w systemie Linux.

Gdy 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, polecenie w górę i polecenie ps wyświetlają procesy zombie.

Niebezpieczeństwa procesów 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 uruchamianiu innych procesów.

Jednak kilka procesów zombie kręci się bez problemu - chociaż wskazują na błąd związany z procesem nadrzędnym w systemie.

Pozbywanie się procesów zombie

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ą komendy kill , zastępując parametr pid w poniższym poleceniu z parametrem PID procesu macierzystego:

kill -s SIGCHLD pid

Jeśli jednak proces nadrzędny nie jest poprawnie zaprogramowany i ignoruje sygnały SIGCHLD, proces ten wygrałnie pomóż.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.