Jos olet Linux-käyttäjä, olet ehkä nähnyt zombie-prosesseja, jotka häiritsevät prosessilistaa. Et voi tappaa zombie-prosessia, koska se on jo kuollut - kuten todellinen zombie.
Zombit ovat periaatteessa kuolleiden prosessien jäljellä olevia bittejä, joita ei ole puhdistettu kunnolla. Ohjelmisto, joka luo zombie-prosesseja, ei ole ohjelmoitu oikein - ohjelmien ei pitäisi antaa zombieprosessien kiinni.
Kuvahinta: Daniel Hollister on Flickr (Remixed)
Jotta ymmärtäisit, mikä zombie-prosessi on ja mistä zombien prosesseja esiintyy, sinun on ymmärrettävä hieman siitä, miten prosessit toimivat Linuxissa.
Kun prosessi kuolee Linuxissa, ei kaikki poistu muistiosta välittömästi - sen prosessikuvaaja pysyy muistissa (prosessi kuvaaja vie vain 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 yleensä hyvin nopeasti, joten et näe zombi-prosesseja, 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, ylin komento ja ps komento näyttää zombie prosesseja.
Zombie-prosessit eivät käytä mitään järjestelmä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 - vaikka ne viittaavat järjestelmään liittyvään vanhempaprosessiin.
Et voi tappaa 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 näppäimellä tappaa komento, korvaa pid alla olevassa komennossa vanhemman prosessin PID: n kanssa:
kill -s SIGCHLD pid
Jos emoprosessi ei kuitenkaan ole ohjelmoitu oikein ja jättää huomiotta SIGCHLD-signaalit, tämä ei kuitenkaan auta. Sinun täytyy tappaa tai sulkea zombien vanhemman prosessi. Kun zombietapahtuma lopettaa, 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.