20Aug
Če ste uporabnik Linuxa, ste morda videli zombie procese, ki se pojavljajo na seznamu vaših procesov. Ne morete ubiti procesa zombi, ker je že mrtev - kot pravi zombi.
Zombiji so v bistvu preostali deli mrtvih procesov, ki niso pravilno očiščeni. Program, ki ustvarja zombie procese, ni pravilno programiran - programi ne smejo pustiti, da se zombijev proces ohrani.
Image Credit: Daniel Hollister na Flickr( Remixed)
Kaj je zombijev proces?
Če želite razumeti, kaj je proces zombija in kaj povzroča, da se pojavijo procesi zombija, boste morali malo razumeti, kako postopki delujejo na Linuxu.
Ko proces umre v Linuxu, se vsi ne odstranijo iz pomnilnika takoj - njegov deskriptor ostane v pomnilniku( opisni dokument procesa ima le majhen obseg pomnilnika).Status procesa postane EXIT_ZOMBIE in staršev procesa je obveščen, da je njen otroški proces umrl s signalom SIGCHLD.Nadrejeni proces nato izvede sistemski poziv() , da prebereta izhodni status mrtvega procesa in druge informacije. To omogoča nadrejenim procesom, da dobijo informacije iz mrtvega procesa. Po čakanju() se postopek zombi popolnoma odstrani iz pomnilnika.
To se običajno zgodi zelo hitro, zato ne boste videli zombijevih procesov, ki se kopičijo v vašem sistemu.Če pa nadrejeni proces ni ustrezno programiran in nikoli ne pokliče čakati() , se bodo njegovi otroci zombija držali v pomnilniku, dokler jih ne bodo očistili.
pripomočki, kot so GNOME System Monitor, ukaz vrh in ps ukazni prikaz zombijevih procesov.
Nevarnosti zombijevih procesov
Procesi zombija ne uporabljajo nobenih sistemskih virov.(Pravzaprav, vsak uporablja zelo majhno količino sistemskega pomnilnika za shranjevanje njenega deskriptorja procesa.) Vendar vsak proces zombi ohrani svoj ID procesa( PID).Linux sistemi imajo končno število ID-jev procesov - 32767 privzeto na 32-bitnih sistemih.Če se zombiji kopičijo zelo hitro - na primer, če nepravilno programirana strežniška programska oprema ustvarja zombie procese pod obremenitvijo - celoten bazen razpoložljivih PID bo sčasoma postal dodeljen zombijevim procesom in preprečil, da bi se drugi postopki začeli izvajati.
Vendar pa nekaj procesov zombijev, ki visijo okrog, niso problem - čeprav označujejo napako s svojim starševskim procesom v vašem sistemu.
Pobiranje zombijevih procesov
Ne morete ubiti zombijevih procesov, saj lahko s signalom SIGKILL ubijete normalne procese - procesi zombija so že mrtvi. Upoštevajte, da vam ni treba znebiti zombijevih procesov, razen če imate na vašem sistemu veliko količino - nekaj zombijev je neškodljivo. Vendar pa obstaja nekaj načinov, kako se znebiti zombijevih procesov.
Eden od načinov je pošiljanje signala SIGCHLD nadrejenim procesom. Ta signal pove staršem procesu, da izvede sistemski klic čakati() in očisti otroke zombi. Pošljite signal z ukazom , da ubijete ukaz in zamenjate pid v spodnjem ukazu s PID nadrejenega procesa:
kill -s SIGCHLD pid
Če pa nadrejeni proces ni pravilno programiran in ignorira signale SIGCHLD,Ne pomagaj. Morali boste ubiti ali zapreti starševski proces zombijev. Ko se proces, ki je ustvaril zombije, konča, init podeduje zombi procese in postane njihova nova starša.(init je prvi proces, ki se je začel na Linux pri zagonu in je dodeljen PID 1.) init redno izvaja sistemski klic wait() za čiščenje svojih zombijevih otrok, zato bo init kratko delo zombijev. Po zaprtju starševskega postopka lahko znova zaženete.
Če nadrejeni proces še naprej ustvarja zombije, ga je treba določiti tako, da ustrezno pokliče čakanje() , da žanje svoje otroke zombi. Poročilo o napaki pošljite, če program v vašem sistemu še naprej ustvarja zombije.