20Aug
Jos olet Linux-käyttäjä, olet ehkä nähnyt zombie-prosesseja, jotka häiritsevät prosessilistasi. Et voi tappaa zombie-prosessia, koska se on jo kuollut - kuten todellinen zombie.
Zombies ovat periaatteessa kuolleiden prosessien jäljellä olevat bittiä, joita ei ole puhdistettu kunnolla. Ohjelmisto, joka luo zombie-prosesseja, ei ole ohjelmoitu oikein - ohjelmien ei pitäisi antaa zombieprosessien kiinni.
Kuvalehti: Daniel Hollister Flickrissä( Remixed)
Mikä on Zombie-prosessi?
Jotta ymmärrettäisiin, mikä zombie-prosessi on ja mistä zombien prosesseja esiintyy, sinun on ymmärrettävä hieman siitä, miten prosessit toimivat Linuxissa.
Kun prosessi kuolee Linuxissa, sitä ei poisteta välittömästi muistista - sen prosessikuvaaja pysyy muistissa( prosessi kuvaaja vain vie vähän muistia).Prosessin tila tulee EXIT_ZOMBIE ja prosessin vanhempi ilmoitetaan, että sen lapsiprosessi on kuollut SIGCHLD-signaalilla. Emoprosessin oletetaan sitten suorittavan odotus() järjestelmän puhelun lukemaan kuolleen prosessin poistumistilan ja muun tiedon. Tämä mahdollistaa emoprosessin saavan tietoa kuolleesta prosessista. Odotuksen jälkeen() kutsutaan zombieprosessi poistetaan kokonaan muistista.
Tämä tapahtuu normaalisti hyvin nopeasti, joten et näe zombieprosesseja, jotka kertyvät järjestelmään. Jos vanhempi prosessi ei kuitenkaan ole ohjelmoitu oikein eikä koskaan kutsuta odotusta() , sen zombialaiset lapset tarttuvat muistiin, kunnes ne puhdistetaan.
Apuohjelmat kuten GNOME System Monitor, top komento ja ps komento näytä zombie prosesseja.
Zombie-prosessien vaarat
Zombie-prosessit eivät käytä järjestelmän resursseja.(Oikeastaan jokainen käyttää hyvin pienen määrän järjestelmämuistia tallentaakseen prosessin kuvaajan.) Kuitenkin kukin zombie-prosessi säilyttää prosessidunnuksensa( PID).Linux-järjestelmissä on rajallinen määrä prosessidunnuksia - 32767 oletuksena 32-bittisissä järjestelmissä.Jos zombiet kerääntyvät hyvin nopealla nopeudella - esimerkiksi jos väärin ohjelmoitu palvelinohjelmisto luo zombieprosesseja kuormituksen aikana, koko käytettävissä olevien PID-mallien koko joukko siirtyy lopulta zombie-prosesseihin estäen muiden prosessien käynnistämisen.
Kuitenkin muutamia zombie-prosesseja, jotka roikkuvat ympäri, eivät ole ongelma - vaikkakin ne viittaavat järjestelmään liittyvään vanhempaprosessiin.
Zombie-prosessien poistaminen
Et voi tappata zombie-prosesseja, koska voit tappaa normaalit prosessit SIGKILL-signaalin avulla - zombie-prosessit ovat jo kuolleet. Muista, että sinun ei tarvitse päästä eroon zombie-prosesseista, ellei sinulla ole suurta määrää järjestelmääsi - muutama zombiet ovat vaarattomia. On kuitenkin olemassa muutamia tapoja, joilla voit päästä eroon zombie-prosesseista.
Yksi tapa on lähettää SIGCHLD-signaali vanhemman prosessiin. Tämä signaali kertoo vanhemman prosessin suorittamaan odotus() järjestelmäpuhelun ja puhdistamaan sen zombie-lapset. Lähetä signaali -tappaa -komennolla, joka korvaa pid -komennon seuraavan komennon kanssa vanhemman prosessin PID: llä:
kill -s SIGCHLD pid
Jos emoprosessi ei ole ohjelmoitu oikein ja jättää huomiotta SIGCHLD-signaalit, se voittit apua. Sinun täytyy tappaa tai sulkea zombien vanhemman prosessi. Kun zombietapahtuma on päättynyt, init periytyy zombieprosesseista ja muuttuu heidän uudeksi vanhemmaksi.(init on ensimmäinen prosessi, joka käynnistetään Linuxissa käynnistyksen yhteydessä, ja sille annetaan PID 1.) init suorittaa määräajoin odotus() -järjestelmänpuhelun zombie-lapsensa puhdistamiseksi, joten init tekee zombien lyhyen työn. Voit aloittaa vanhempaprosessin uudelleen sulkemisen jälkeen.
Jos vanhempi prosessi luo zombeja edelleen, se on korjattava niin, että se vaatii oikein odottaa() saada zombi lapsiaan. Lähetä vikailmoitus, jos järjestelmässäsi oleva ohjelma pitää zombeja luomalla.