20Aug
Ak ste používateľom systému Linux, možno ste zaznamenali zombie procesy okolo vašich zoznamov procesov. Nemôžete zabiť zombie proces, pretože je už mŕtvy - ako skutočný zombie.
Zombie sú v podstate zostávajúce kúsky mŕtvych procesov, ktoré neboli správne vyčistené.Program, ktorý vytvára zombie procesy nie je naprogramovaný správne - programy nemajú nechať zombie procesy držať okolo.
Image Credit: Daniel Hollister na Flickr( Remixed)
Čo je to zombie proces?
Aby ste pochopili, čo je proces zombie a čo spôsobuje, že zombie procesy sa objavia, budete musieť trochu pochopiť, 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 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.
Toto 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 naprogramovaný správne a nikdy nečaká na čakanie() , jeho deti zombie sa držia v pamäti až do vyčistenia. Nástroje
ako GNOME System Monitor, top príkaz a príkaz ps zobrazujú zombie procesy.
Nebezpečenstvo zombie Procesy Zombie
nepouží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 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 - hoci ukazujú chybu s rodičovským procesom vo vašom systéme.
Zbavenie sa zombijských 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 odoslaní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 príkazu kill , ktorý nahradí 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ôžete. 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 mu pridelené PID 1.) init periodicky vykonáva čakaciu() systémovú výzvu 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 zožral svoje deti zombie. Nahrajte správu o chybe, ak program vo vašom systéme stále vytvára zombie.