Co to jest proces Zombie w systemie Linux?
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.
Zdjęcie: Daniel Hollister na Flickr (Remiksowane)
Co to jest proces zombie?
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 zostanie odpowiednio zaprogramowany i nigdy nie zostanie wywołany wait (), jego dzieci zombie pozostaną w pamięci, dopóki nie zostaną oczyszczone.
Narzędzia takie jak Monitor systemu GNOME, Top polecenie i ps polecenia wyświetlają procesy zombie.
Niebezpieczeństwa związane z procesami 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 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, jeśli nie masz dużej ilości w systemie - 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ł informuje proces macierzysty, 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 właściwie 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. Złóż raport o błędzie, jeśli program w twoim systemie nadal tworzy zombie.