Kaj je proces zombi na Linuxu?
Če ste uporabnik Linuxa, ste morda videli zombi procese, ki se nabirajo okoli vašega seznama procesov. Ne moreš ubiti zombi procesa, ker je že mrtev - kot pravi zombi.
Zombiji so v bistvu ostanki bitov mrtvih procesov, ki niso bili pravilno očiščeni. Program, ki ustvarja zombi procese, ni pravilno programiran - programi ne smejo pustiti, da bi se zombi procesi zadrževali.
Zasluge za sliko: Daniel Hollister na Flickru (remixed)
Kaj je Zombie proces?
Da bi razumeli, kaj je proces zombi in kaj povzroča pojavljanje zombi procesov, boste morali malo razumeti, kako procesi delujejo v Linuxu.
Ko proces umre na Linuxu, se ne shrani takoj iz pomnilnika - njegov procesni deskriptor ostane v spominu (procesni deskriptor potrebuje le majhno količino pomnilnika). Status procesa postane EXIT_ZOMBIE in starš procesa je obveščen, da je njegov podrejeni proces umrl s signalom SIGCHLD. Nadalje naj bi nadrejeni proces izvršil sistemski klic čakanja (), da bi prebral status izhoda mrtvega procesa in druge informacije. To omogoča nadrejenemu procesu, da dobi informacije iz mrtvega procesa. Po pozivu wait () se proces zombi popolnoma odstrani iz pomnilnika.
To se običajno zgodi zelo hitro, tako da se na vašem sistemu ne bodo zbirali zombi procesi. Če starševski proces ni pravilno programiran in nikoli ne pokliče wait (), se bodo njegovi zombi otroci držali v spominu, dokler ne bodo očiščeni.
Pripomočki, kot je GNOME System Monitor, na vrh in ukaz ps ukaz ukaz zombi procesov.
Nevarnosti zombi procesov
Zombie procesi ne porabijo nobenih sistemskih virov. (Pravzaprav vsak uporablja zelo majhno količino sistemskega pomnilnika za shranjevanje deskriptorja procesa.) Vendar pa vsak zombi proces obdrži svoj ID procesa (PID). Linux sistemi imajo končno število procesnih ID-jev - 32767 privzeto na 32-bitnih sistemih. Če se zombiji kopičijo zelo hitro - na primer, če nepravilno programirana strežniška programska oprema ustvarja zombi procese pod obremenitvijo - bo celoten nabor razpoložljivih PID-jev sčasoma dodeljen zombi procesom, kar bo preprečilo druge procese..
Vendar pa nekaj zombi procesov, ki visijo okrog, niso problem - čeprav kažejo na napako s svojim nadrejenim procesom v vašem sistemu.
Kako se znebiti zombi procesov
Ne moreš ubiti zombi procesov, saj lahko ubiješ normalne procese s signalom SIGKILL - zombi procesi so že mrtvi. Imejte v mislih, da vam ni treba znebiti zombi procesov, razen če imate velik znesek na vašem sistemu - nekaj zombijev je neškodljivih. Vendar pa obstaja nekaj načinov, kako se lahko znebite zombi procesov.
Eden od načinov je pošiljanje signala SIGCHLD nadrejenemu procesu. Ta signal pove nadrejenemu procesu, da izvede sistemski klic čakanja () in očisti svoje zombi otroke. Pošljite signal s ubiti ukaz, zamenjava pid v spodnjem ukazu s PID nadrejenega procesa:
kill -s SIGCHLD pid
Če pa starševski proces ni pravilno programiran in ignorira signale SIGCHLD, to ne bo pomagalo. Morali boste ubiti ali zapreti matični proces zombijev. Ko se proces, ki je ustvaril zombije, konča, init podeduje zombi procese in postane njihov novi starš. (init je prvi proces, ki se je zagnal v Linuxu ob zagonu in mu je dodeljen PID 1.) init občasno izvede sistemski klic wait (), da očisti svoje zombi otroke, zato bo init naredil kratko delo zombijev. Po zapiranju ga lahko znova zaženete.
Če nadrejeni proces še naprej ustvarja zombije, ga je treba popraviti, tako da pravilno pokliče wait (), da požene svoje zombi otroke. Vnesite poročilo o napaki, če program v vašem sistemu stalno ustvarja zombije.