Čo je zombie proces na Linuxe?
Ak ste používateľom systému Linux, pravdepodobne ste videli zombie procesy okolo vašej zoznamu procesov. Nemôžete zabiť zombie proces, pretože je už mŕtvy - ako skutočný zombie.
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ú robiť zombie procesy.
Image Credit: Daniel Hollister na Flickr (Remixed)
Čo je zombie proces??
Aby ste pochopili, čo je proces zombie a čo spôsobuje, že sa zombie procesy objavia, budete musieť trochu porozumieť tomu, ako fungujú procesy na Linuxe.
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 má 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 stane 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íkazové zobrazenie zombie procesov.
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ý zombíci 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 zaťažené - celý súbor dostupných PID sa nakoniec priradí zombickým procesom, čím zabráni spusteniu iných procesov.
Avšak niekoľko zombie procesov visí okolo nie je žiadny problém - hoci 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 pomocou signálu SIGKILL - zombie procesy sú už mŕtve. Majte na pamäti, že sa nemusíte zbavovať zombie procesov, pokiaľ nemáte veľké množstvo na vašom systéme - niekoľko zombie je neškodné. Avšak, existuje niekoľko spôsobov, ako sa môžete zbaviť zombie procesov.
Jedným zo spôsobov je odoslanie signálu SIGCHLD do rodičovského procesu. Tento signál hovorí, že rodičovský proces vykoná systémový hovor čakania () a vyčistí jeho deti zombie. Odošlite signál pomocou tlačidla zabiť príkaz, nahrádzanie pid v príkaze nižšie s PID rodičovského procesu:
zabiť -s SIGCHLD pid
Ak však rodičovský proces nie je naprogramovaný správne a ignoruje signály SIGCHLD, nepomôže to. Budete musieť zabiť alebo ukončiť 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ý na Linuxe 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ť opravený tak, aby správne volal wait (), aby sklopil svoje zombie deti. Nahrajte správu o chybe, ak program vo vašom systéme stále vytvára zombie.