Proces Zombie, który się administratorowi nie kłaniał
Ponieważ wiosenna aura skłania ku regeneracji zapomnianych funkcji naszego organizmu, czas na uderzenie sporej dawki fachowych terminów, przerażającego terminala i wszystkiego, o istnieniu czego nie chciałby wiedzieć zwykły użytkownik siedzący w zaciszu swojego ulubionego portalu społecznościowego. Rzecz będzie o Zombie. Procesach, które są nieczułe na polecenie kill i pochodnych.
Narodziny Zombie
Wszyscy uświadomieni użytkownicy oczywiście znają tę opowieść i zapewne potwierdzą moje słowa, że proces Zombie to pozostałość działania procesu potomnego, który po zakończeniu swojej pracy, zwolnieniu zasobów CPU i RAM, nadal figuruje na liście procesów. Dzieje się tak przez błąd (lub jakieś przypadki losowe) w procesie rodzica, który nieodpowiednio obsłużył zamknięcie wspomnianego procesu potomnego (powinien wywołać systemową procedurę “wait” i pobrać prawidłowy status procesu). Tak powstaje Zombie. Jakie niebezpieczeństwo niesie ze sobą taki proces, skoro nie zajmuje zasobów? Pojedynczy proces to może nic groźnego, ale już cała armia Zombie może doprowadzić do destabilizacji systemu w wyniku zapchania tablicy procesów (która zwykle posiada wartość graniczną swojego rozmiaru).
Tak wygląda przeciwnik
Na destabilizację pracy komputera domowego można przymknąć oko (do pewnego czasu), jednak przy komputerach służących poważniejszym celom procesy Zombie nie są pożądanym elementem. Jak zatem skontrolować, ile Zombie mamy w obejściu? Ich detekcję można wykonać poleceniem top, lub;
ps aux
Wszystkie procesy posiadające w kolumnie STAT oznaczenie Z (lub defunct przy nazwie procesu) to Zombie. Poznajcie się.
Sztuka zabijania Zombie
Jak pozbyć się takiego gościa z systemu? W przypadkach szczególnych (np. duże obciążenie systemu) można zaczekać przez chwilę, aż proces rodzica się ogarnie i prawidłowo pozamyka swoje podprocesy. Jednak jeżeli to nic nie daje, czas na inne rozwiązania. Polecenie kill -9 nie ima się Zombie, gdyż one i tak są już martwe – na dodatek nie zajmują żadnych zasobów. Jedynym rozwiązaniem jest wysłanie procesu SIGCHLD do rodzica, by ten pozamykał swoje procesy potomne. Jak jednak odnaleźć nieodpowiedzialnego rodzica?
ps fo ppid numer_procesu_zombie
I otrzymany numer PPID wykorzystamy w poleceniu:
kill -s SIGCHLD otrzymany_powyżej_numer_PPID
Może się okazać jednak, że rodzic jest na tyle źle napisany, że nie potrafi/nie chce/nie może poprawnie obsłużyć sygnału SIGCHLD i pomimo naszych starań, czereda Zombie dalej hasa po liście procesów. W takim wypadku pozostaje nam nauczyć się z nimi żyć, lub ukrócić nieodpowiedzialnego rodzica.
kill -9 otrzymany_powyżej_numer_PPID
Wraz z nim znikną i jego procesy potomne.
Na koniec, różnica pomiędzy procesami Zombie a Orphan. Mianowicie, o ile w przypadku procesów Zombie można zidentyfikować rodzica, to porzucone procesy Orphan takiego rodzica nie posiadają. Charakteryzują się wartość PPID równą 1 (czyli przynależnością do procesu init). Jednak z nimi można już sobie poradzić ulubionym przez wielu poleceniem kill -9.