Zombi proces v Linuxu se nanaša na tiste že mrtve procese, ki pa so na tak ali drugačen način še vedno prisotni v procesni tabeli sistema. Vrzel je v tem, da starš iz nekega razloga tega procesa ni očistil iz tabele procesov. Običajno se to zgodi po zaključku izvršilnega postopka.
Običajni način delovanja v Linuxu je, da po zaključku procesa obvesti starša, ki je odgovoren za odstranitev procesa iz tabele. Na žalost starš postopka ne more odstraniti iz spomina v primerih, ko starš ne more prebrati otrokovega statusa. Tako se zgodi, da imamo v tabeli procesov mrtve procese. Temu pravimo zombi procesi.
Kaj povzroča Linux Zombie procese?
Ko je podrejeni postopek ustvarjen, lahko slabo napisan nadrejeni postopek ne prikliče funkcije wait (). Posledično se bodo njeni zombi otroci zadrževali v spominu, dokler ne bodo ugasnili.
To pomeni, da nič ne spremlja otrokovega procesa glede sprememb stanja, signal SIGCHLD pa bo prezrt. Morda druga aplikacija moti izvajanje starševskega procesa bodisi s slabim programiranjem bodisi z zlonamernim namenom.
Pravilnega vzdrževanja sistema ne bo, če nadrejeni postopek ne bo opazoval sprememb stanja v podrejenem procesu.
Ko se postopek dojenčka konča, PCB in vnos v tabelo postopkov ne bo odstranjen. Zaradi tega se stanje zombija nikoli ne odstrani s PCB-ja.
Zombiji sicer imajo nekaj spomina, vendar običajno to ni problem. Ker imajo sistemi Linux končno število PID-ov (čeprav veliko število), če je zombiranih dovolj PID-ov, se noben drug postopek ne more začeti. Dvomljivo je, da se bo to zgodilo.
Vendar pa zombirani procesi kažejo, da je z aplikacijo šlo kaj narobe in da ima določen program napako.
Napak programske opreme v podatkovnih centrih ne smemo dopuščati in jih je treba odpraviti.
Pazite in uničujte zombi procese, dokler napake ne odpravite.
ID-ja procesa ni mogoče ponovno uporabiti, dokler se ne zažene, zato je vnos v tabelo procesov majhen.
Ker je PCB veliko večji od vnosa tabele procesov v 64-bitnem operacijskem sistemu, to verjetno ne bo povzročalo težav.
Na količino pomnilnika, ki je na voljo za druge procese, lahko vpliva veliko število zombijev. Če pa imate toliko zombijev, imate resne težave s starševsko aplikacijo ali napako v operacijskem sistemu.
Torej, kaj storite, ko se postopek spremeni v zombija? Izsledite in odpravite zombi procese.
Kako najti postopek zombija?
Začetna zaustavitev procesa ubijanja zombijev v sistemu je, da ga najprej prepoznamo. Ker se postopek init po zombijih redno čisti, je vse, kar morate storiti, da se jih znebite, uničiti postopek, ki jih je ustvaril.
Z zgornjim ukazom lahko hitro ugotovite, ali je na vašem območju zombi. Da bi to dosegli, bomo izvedli naslednji ukaz.
vrh
Število zombi procesov v tem sistemu bo prikazano na izhodu. V našem primeru zgoraj imamo 0 zombijev.
Z ukazom ps in njegovo napeljavo v egrep lahko dobimo njihov seznam. Državna zastava za zombi procese je "Z", včasih pa boste videli tudi "neaktiven".
tuts @ fosslinux: ~ $ ps aux | egrep "Z | odsoten"
Razčlenimo različne odseke tega ukaza.
Z v stolpcu STAT izhoda označuje postopek zombija.
[defunct] v zadnjem (COMMAND) izhodnem stolpcu tudi identificira zombi proces.
Idealno je, da postopka zombi ni mogoče ubiti, ker je mrtev. Namesto tega starša obvestimo, da poskuša in prebere status otrokovega procesa ter ga na koncu očisti iz sistemske tabele. Da bi sprožili ta postopek, staršu procesa pošljemo signal SIGCHLD. Prepoznavanje ID-ja nadrejenega procesa ali tistega, kar se imenuje PID, vključuje zagon naslednjega ukaza:
tuts @ fosslinux: ~ $ ps -o ppid =
Po pridobitvi PID-ja zombija uporabite signal ukaza SIGCHLD za predhodno identificirane nadrejene procese.
tuts @ fosslinux: ~ $ kill -s SIGCHLD
V nekaterih primerih to ne razjasni postopka zombi. To nas poziva, da se vključimo v načrt b ali c. Predhodna zahteva ponovni zagon nadrejenega procesa ali ubijanje nadrejenih procesov. Po drugi strani pa slednji primeri vključujejo ponovni zagon sistema, zlasti kadar lahko postopek Zombie povzroči izpad ali velik val zaradi procesa Zombie.
Spodaj je ukaz za ubijanje nadrejenega procesa.
tuts @ fosslinux: ~ $ kill -9
V primeru, da je nadrejeni proces umorjen, se postranijo tudi vsi podrejeni procesi danega starša. Če je kateri od podrejenih procesov v danem trenutku kritičen, boste morda morali odložiti pobijanje, dokler ne bo varno. Po drugi strani pa vam lahko hitra dvojna kontrola pove, koliko pomnilnika ali procesorske moči zasedajo procesi Zombie. To pomaga ugotoviti, ali je boljša možnost ubiti nadrejeni procesor, da vnovič zažene sistem v naslednjem ciklu vzdrževanja sistema, ki je že načrtovan.
Kako v Linuxu delujejo stanja procesov?
Seveda mora Linux spremljati vse programe in demone, ki se izvajajo v vašem računalniku. Vzdrževanje tabele procesov je eden od načinov, kako to doseči.
To je seznam struktur pomnilnika jedra. Ta seznam vključuje vnos za vsak postopek, ki vsebuje nekaj informacij o njem. Vsaka struktura tabel procesov vsebuje zelo malo informacij.
Shranijo ID procesa, nekaj drugih podatkov in kazalec na blok za nadzor procesa (PCB).
Na PCB-ju Linux shranjuje vse informacije, ki jih potrebuje za iskanje ali nastavitev za posamezen postopek. Ko se postopek ustvari, se spremeni, mu da čas obdelave in nato uniči.
Na PCB Linuxu je več kot 95 polj. Določena je v strukturi opravil, ki je dolga več kot 700 vrstic. Na PCB-ju lahko najdete naslednje vrste informacij:
Stanja procesa so ponazorjena spodaj
- Številka procesa: prepoznavni identifikator operacijskega sistema.
- Števec programov: Ko ta postopek ponovno dobi dostop do CPU, bo sistem na tem naslovu poiskal naslednje navodilo postopka, ki naj se izvede.
- Registri: Ta postopek uporablja seznam registrov CPU, ki se imenujejo registri. Na seznam so lahko vključeni akumulatorji, indeksni registri in kazalci skladov.
- Odprti seznam datotek: datoteke, povezane s tem postopkom, so vključene na seznam odprtih datotek.
- Informacije o razporejanju CPU: Uporabljajo se za izračun, kako pogosto in kako dolgo ta proces prejema čas obdelave CPU.
PCB mora zabeležiti prednost procesa, kazalce na čakalne vrste za razporejanje in druge parametre razporejanja. - Informacije o upravljanju pomnilnika: informacije o pomnilniku, ki ga uporablja ta postopek, na primer začetni in končni naslovi pomnilnika procesa, pa tudi kazalci na pomnilniške strani.
- Informacije o stanju V / I: Vse naprave, ki jih postopek uporablja kot vhode ali izhode.
"Stanje procesa" je lahko kar koli od naslednjega:
- R: Potek ali postopek, ki ga je mogoče zagnati. Deluje, kar pomeni, da pridobiva in izvaja CPU cikle.
Postopek, ki je pripravljen za zagon, čaka na režo CPU. - S: Spanje.
Postopek čaka na dokončanje dejanja, kot je vhodna ali izhodna operacija. Ali razpoložljivost vira. - D: Postopek je v stanju neprekinjenega spanca. Uporablja sistemski klic, ki blokira, kar pomeni, da ne bo nadaljeval, dokler sistemski klici niso končani. Za razliko od stanja mirovanja se proces v tem stanju ne bo odzival na signale, dokler sistemski klic ne bo končan in se bo postopek vrnil v postopek.
- T: Ker je dobil signal SIGSTOP, se je postopek končal (ustavil).
Odzval se bo le na signale SIGKILL ali SIGCONT, bodisi ubil bodisi ukazal, naj postopek nadaljuje. Ko preklopite z nalog v ospredju (fg) na opravila v ozadju (bg), se to zgodi. - Z: pomeni Zombi proces. Ko je postopek končan, preprosto ne izgine. Namesto tega sprosti pomnilnik, ki ga trenutno uporablja, in izstopi iz pomnilnika, vendar vnos tabele procesov in PCB ostaneta.
Njeno stanje je nastavljeno na EXIT ZOMBIE, nadrejenemu procesu pa se sporoči, da je postopek dojenčka dokončan s signalom SIGCHLD.
Zaključek
Zombiji niso tako škodljivi, razen če so del velike horde. Nekaj jih ni veliko in hiter ponovni zagon jih bo odpravil. Vendar je treba upoštevati eno točko.
Arhitekture Linuxa imajo največje število procesov in posledično največje število ID-jev procesov. Ko je v računalniku doseženo največje število zombi procesov, novih postopkov ni mogoče zagnati.
Zombi procesi niso procesi; so ostanki mrtvih procesov, ki jih njihov nadrejeni proces ni pravilno očistil. Če pa opazite, da določena aplikacija ali postopek nenehno drste zombije, bi morali nadalje raziskati.
Najverjetneje gre le za slabo napisan program; v tem primeru morda obstaja posodobljena različica, ki se očisti po pravilni obdelavi otroka.