Zombie sú v podstate zvyšné kúsky mŕtvych procesov, ktoré neboli riadne vyčistené. Program, ktorý vytvára zombie procesy nie je naprogramovaný správne - programy nemajú nechať zombie procesy držať okolo.
Čo je zombie proces?
Aby ste pochopili, čo je proces zombie a čo spôsobuje zombie procesy, objaví sa, budete musieť trochu porozumieť tomu, ako procesy pracujú na systéme Linux.
Keď proces zomiera v systéme Linux, nie je to všetko z pamäte okamžite odstránené - jeho deskriptor procesov zostáva v pamäti (deskriptor procesu si vyžaduje len malé množstvo pamäte). Stav procesu sa stáva EXIT_ZOMBIE a rodič procesu je upozornený, že jeho detský proces zomrel pomocou signálu SIGCHLD. Rodičovský proces má potom spustiť čakací () systémový hovor, aby si prečítal stav ukončenia mŕtveho procesu a ďalšie informácie. To umožňuje rodičovskému procesu získať informácie z mŕtvych procesov. Po vyvolaní čakania () sa zombie úplne odstráni z pamäte.
To sa zvyčajne stáva veľmi rýchlo, takže v systéme nebudete vidieť zombie procesy. Ak však rodičovský proces nie je správne naprogramovaný a nikdy nezačne čakať (), jeho zombie deti sa držia v pamäti, kým sa nevyčistia.
Nástroje ako GNOME System Monitor, top príkaz a ps príkaz zombie procesy.
Nebezpečenstvo zombie procesov
Zombie procesy nevyužívajú žiadne systémové zdroje. (V skutočnosti každá z nich používa veľmi malé množstvo systémovej pamäte na ukladanie svojho deskriptora procesu.) Každý zombie proces si však ponecháva ID procesu (PID). Systémy Linux majú konečný počet ID procesov - 32767 štandardne na 32-bitových systémoch. Ak sa zombie hromadia veľmi rýchlo - napríklad ak nesprávne naprogramovaný serverový softvér vytvára zombie procesy pod zaťažením - celý súbor dostupných PID sa nakoniec priradí procesom zombie, čím zabráni spusteniu iných procesov.
Avšak niekoľko zombie procesov visí okolo nie je žiadny problém - aj keď ukazujú chybu s rodičovským procesom vo vašom systéme.
Zbaviť sa zombie procesov
Nemôžete zabíjať zombie procesy, pretože môžete zabiť normálne procesy so signálom SIGKILL - zombie procesy sú už mŕtve. Majte na pamäti, že sa nemusíte zbaviť zombie procesov, pokiaľ nemáte veľké množstvo na vašom systéme - niekoľko zombie je neškodné. Existuje však niekoľko spôsobov, ako sa môžete zbaviť zombie procesov.
Jedným zo spôsobov je zaslaním signálu SIGCHLD do rodičovského procesu. Tento signál informuje rodičovský proces o vykonaní čakania na čakanie () a vyčistenie jeho detských zombie. Odošlite signál pomocou tlačidla zabiť príkaz, nahrádzať pid v príkaze nižšie s PID rodičovského procesu:
kill -s SIGCHLD pid
Ak však rodičovský proces nie je správne naprogramovaný a ignoruje signály SIGCHLD, nepomôže to. Budete musieť zabiť alebo zavrieť rodičovský proces zombie. Keď proces, ktorý vytvoril zombie, končí, init zdedí zombie procesy a stáva sa ich novým rodičom. (init je prvý proces spustený v systéme Linux pri zavádzaní a je pridelený PID 1.) init periodicky vykonáva čakanie () systémové volanie na vyčistenie svojich zombie detí, takže init bude robiť krátku prácu zombie. Po ukončení rodičovského procesu môžete reštartovať.
Ak rodičovský proces naďalej vytvára zombie, mal by byť nastavený tak, aby správne volal čakať (), aby zožieral svoje deti zombie. Nahrajte správu o chybe, ak program vo vašom systéme stále vytvára zombie.