Mis on „zombie protsess” Linuxis?
Kui sa oled Linuxi kasutaja, siis võib-olla olete näinud zombi protsesside ümberlülitamist oma protsesside loendi ümber. Sa ei saa tappa zombi protsessi, sest see on juba surnud - nagu tegelik zombi.
Zombies on põhimõtteliselt surnud protsesside jäänused, mida pole korralikult puhastatud. Programm, mis loob zombie protsessid, ei ole programmeeritud õigesti - programmid ei peaks lasta zombie protsessidel kinni pidada.
Pildi krediit: Daniel Hollister Flickril (Remixed)
Mis on zombie protsess?
Et mõista, mis on zombi protsess ja mis põhjustab zombi protsesside ilmumist, peate natuke aru saama, kuidas protsessid Linuxis töötavad.
Kui protsess sureb Linuxis, ei eemaldata see kohe mälust - selle protsessi deskriptor jääb mällu (protsessi deskriptor võtab ainult väikese hulga mälu). Protsessi staatus muutub EXIT_ZOMBIE-le ja protsessi vanemale teatatakse, et selle lapseprotsess on surnud SIGCHLD-signaaliga. Seejärel peaks vanemprotsess täitma süsteemi (call) süsteemi kõne, et lugeda surnud protsessi väljumise olekut ja muud teavet. See võimaldab vanemprotsessil saada surnud protsessist teavet. Pärast ootamist () kutsutakse zombie protsess täielikult mälust välja.
Tavaliselt juhtub see väga kiiresti, nii et teie süsteemis ei leidu zombi protsesse. Kui aga vanemprotsess ei ole korralikult programmeeritud ja kunagi ei oota (), jäävad selle zombie-lapsed mällu, kuni nad on puhastatud.
Utiliidid nagu GNOME System Monitor, top käsk ja ps käsu kuva zombie protsessid.
Zombie protsesside ohud
Zombie protsessid ei kasuta süsteemi ressursse. (Tegelikult kasutab igaüks väga väikest kogust süsteemimälu, et salvestada oma protsessi deskriptor.) Kuid iga zombie protsess säilitab oma protsessi ID (PID). Linuxisüsteemidel on 32-bitistel süsteemidel vaikimisi arv protsessiprotsesse - 32767. Kui zombisid kogunevad väga kiiresti - näiteks kui valesti programmeeritud serveritarkvara tekitab koormuse zombieprotsesse - saab kogu saadaolevate PID-ide kogumi zombie protsesside jaoks, takistades teiste protsesside käivitamist.
Kuid mõned zombie protsessid, mis rippuvad, ei ole probleemiks - kuigi nad näitavad viga oma vanemprotsessiga teie süsteemis.
Zombie protsesside vabastamine
Zombie protsesse ei saa tappa, sest SIGKILL signaali abil saate tavapäraseid protsesse tappa - zombie protsessid on juba surnud. Pidage meeles, et teil ei ole vaja zombie protsessidest vabaneda, välja arvatud juhul, kui teil on palju oma süsteemis - mõned zombid on ohutud. Siiski on mõned viisid, kuidas zombi protsessidest vabaneda.
Üks võimalus on SIGCHLD signaali saatmine vanemprotsessile. See signaal ütleb vanemprotsessile, et ta täidab ooterežiimi () süsteemi kõne ja puhastab oma zombi-lapsed. Saada signaal tappa käsk, asendades pid allpool olevas käsus koos vanemprotsessi PID-ga:
kill S SIGCHLD pid
Kui aga vanemprotsess ei ole korralikult programmeeritud ja ignoreerib SIGCHLD signaale, siis see ei aita. Sa pead tapma või sulgema zombide vanemprotsessi. Kui protsess, mis zombisid lõi, algab, pärib init zombie protsessid ja muutub nende uueks vanemaks. (init on esimene protsess, mis käivitati Linuxis alglaadimisel ja sellele omistatakse PID 1.) init käivitab perioodiliselt ooteaeg () süsteemi kõne, et puhastada oma zombi lapsi, nii et init teeb zombisid lühikese töö. Pärast selle sulgemist saate vanemprotsessi taaskäivitada.
Kui vanemprotsess jätkab zombide loomist, tuleks see fikseerida nii, et see nõuab korralikult ootama (), et saada oma zombie-lapsi. Laadige veateade, kui teie süsteemis olev programm loob zombisid.