Mikä on zombie-prosessi Linuxissa?
Jos olet Linux-käyttäjä, olet ehkä nähnyt zombie-prosesseja, joissa on häiriöitä prosessien luettelon ympärillä. Et voi tappaa zombie-prosessia, koska se on jo kuollut - kuin todellinen zombie.
Zombit ovat pohjimmiltaan kuolleiden prosessien jäänteitä, joita ei ole puhdistettu kunnolla. Ohjelma, joka luo zombie-prosesseja, ei ole ohjelmoitu oikein - ohjelmien ei pitäisi antaa zombie-prosesseille kiinni.
Kuvaluotto: Daniel Hollister Flickrissä (Remixed)
Mikä on zombie-prosessi?
Jos haluat ymmärtää, mitä zombie-prosessi on ja mikä aiheuttaa zombie-prosessien näkyvän, sinun täytyy ymmärtää vähän siitä, miten prosessit toimivat Linuxissa.
Kun prosessi kuolee Linuxissa, sitä ei poisteta muistista välittömästi - sen prosessikuvaus pysyy muistissa (prosessikuvaus ottaa vain pienen määrän muistia). Prosessin tila muuttuu EXIT_ZOMBIE ja prosessin vanhemmalle ilmoitetaan, että sen lapsiprosessi on kuollut SIGCHLD-signaalilla. Sen jälkeen vanhemman prosessin pitäisi suorittaa odotus () -järjestelmän puhelu lukemaan kuolleen prosessin poistumistila ja muut tiedot. Tämä mahdollistaa vanhemman prosessin saada tietoa kuolleesta prosessista. Odottamisen jälkeen () kutsutaan zombie-prosessi kokonaan muistista.
Tämä tapahtuu yleensä hyvin nopeasti, joten et näe zombie-prosesseja, jotka kerääntyvät järjestelmään. Jos vanhemman prosessi ei ole ohjelmoitu oikein ja ei koskaan soita odottamaan (), sen zombie-lapset pysyvät muistissa muistissa, kunnes ne puhdistetaan.
Apuohjelmat, kuten GNOME System Monitor, ylin komento ja ps komento näyttää zombie-prosessit.
Zombie-prosessien vaarat
Zombie-prosessit eivät käytä järjestelmän resursseja. (Itse asiassa kukin käyttää hyvin pienen määrän järjestelmän muistia prosessin kuvauksen tallentamiseen.) Jokainen zombie-prosessi kuitenkin säilyttää prosessitunnuksensa (PID). Linux-järjestelmissä on rajallinen määrä prosessi-ID-tunnuksia - 32767 32-bittisissä järjestelmissä. Jos zombeja kerääntyy hyvin nopeasti - esimerkiksi jos väärin ohjelmoitu palvelinohjelmisto luo zombie-prosesseja kuormituksen alla - koko käytettävissä olevien PID-poolien määrä muuttuu lopulta zombie-prosesseiksi, mikä estää muita prosesseja käynnistymästä.
Muutama zombie-prosessi ei kuitenkaan ole ongelma - vaikka ne viittaavat virheeseen, jossa on vanhemman prosessinsa järjestelmässä.
Zombie-prosessien vapauttaminen
Et voi tappaa zombie-prosesseja, koska voit tappaa normaalit prosessit SIGKILL-signaalilla - 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 zombe on vaaraton. On kuitenkin olemassa muutamia tapoja päästä eroon zombie-prosesseista.
Yksi tapa on lähettää SIGCHLD-signaali vanhemmalle prosessille. Tämä signaali kertoo vanhemman prosessin suorittamaan odotus () -järjestelmän puhelun ja puhdistamaan sen zombie-lapset. Lähetä signaali tappaa komento, korvaa pid alla olevassa komennossa vanhemman prosessin PID: n kanssa:
tappaa -s SIGCHLD pid
Kuitenkin, jos vanhemman prosessi ei ole ohjelmoitu oikein ja ohittaa SIGCHLD-signaaleja, tämä ei auta. Sinun täytyy tappaa tai sulkea zombeiden vanhempi prosessi. Kun zombien luomisprosessi päättyy, init perii zombien prosessit ja siitä tulee heidän uusi vanhempansa. (init on ensimmäinen prosessi, joka käynnistyi Linuxissa käynnistyksessä ja sille on määritetty PID 1.) init suorittaa ajoittain odotus () -järjestelmän puhelun puhdistaa sen zombie-lapset, joten init tekee zombien lyhyen työn. Voit aloittaa vanhemman prosessin uudelleen sen sulkemisen jälkeen.
Jos vanhemman prosessi luo edelleen zombeja, se olisi vahvistettava niin, että se kutsuu odottamaan () odottamaan zombie-lapsiaan. Tiedosto vikailmoitetaan, jos järjestelmässä oleva ohjelma luo edelleen zombeja.