20Aug
Ako ste korisnik Linuxa, možda ste vidjeli zombije koji se kriju oko vaših procesnih popisa. Ne možete ubiti zombi jer je već mrtav - poput zombija.
Zombi su u osnovi ostatak bitova mrtvih procesa koji nisu ispravno očišćeni. Program koji stvara zombijeve procese nije pravilno programiran - programi ne bi smjeli dopustiti da se zombi procesi drže oko sebe.
Image Credit: Daniel Hollister na Flickr( Remixed)
Što je zombi proces?
Da biste shvatili što je zombi proces i što uzrokuje pojavljivanje zombičkih procesa, morat ćete malo razumjeti kako se procesi rade na Linuxu.
Kad proces umre na Linuxu, nije sve odmah uklonjeno iz memorije - njegov opis procesa ostaje u memoriji( procesni deskriptor ima samo sitnu količinu memorije).Status procesa postaje EXIT_ZOMBIE i roditelj procesa je obaviješten da je njegov proces djeteta poginuo uz SIGCHLD signal. Proces roditelja trebao bi zatim izvršiti poziv sustava za čekanje() da bi pročitao izlazni status mrtvog procesa i ostale informacije. To omogućuje roditeljskom procesu da dobije informacije iz mrtvog procesa. Nakon čekanja() , zombi proces je potpuno uklonjen iz memorije.
To se obično događa vrlo brzo, tako da nećete vidjeti zombi procese koji se akumuliraju na vašem sustavu. Međutim, ako roditeljski proces nije pravilno programiran i nikad ne naziva čekanje() , njegova će zombijska djeca ostati u memoriji sve dok ne budu očišćena.
Uslužni programi poput GNOME System Monitor, vrh naredba i ps naredba prikazuju zombi procesa.
Opasnosti zombi procesa
Zombi procesi ne koriste nikakve resurse sustava.(Zapravo, svatko koristi vrlo malu količinu sistemske memorije za spremanje deskriptora procesa.) Međutim, svaki zombi proces zadržava svoj ID procesa( PID).Linux sustavi imaju konačan broj ID-ova procesa - 32767 prema zadanim postavkama na 32-bitnim sustavima. Ako se zombiji nakupljaju na vrlo brzoj razini - na primjer, ako nepravilno programirani poslužiteljski softver stvara zombijeve procese pod opterećenjem - cijeli skup raspoloživih PID-a će na kraju postati dodijeljen zombi procesima, sprečavajući pokretanje drugih procesa.
Međutim, nekoliko zombi procesa koji visi oko nisu nikakvi problemi - iako ukazuju na bug s procesom roditelja na vašem sustavu.
Otklanjanje zombi procesa
Ne možete ubiti zombijeve procese jer možete uništiti normalne procese uz SIGKILL signal - zombi procesi su već mrtvi. Imajte na umu da se ne morate riješiti zombi procesa, osim ako nemate veliku količinu na vašem sustavu - nekoliko zombija je bezopasno. Međutim, postoji nekoliko načina na koje možete riješiti zombi procesa.
Jedan od načina je slanje SIGCHLD signala roditeljskom procesu. Ovaj signal kaže roditeljskom procesu da izvrši čekanje() poziv sustava i očisti svoju zombičku djecu. Slanje signala s ubiti naredbu, zamjenjujući pid u naredbi ispod s PID roditeljskog procesa:
kill -s SIGCHLD pid
Međutim, ako roditeljski proces nije programiran pravilno i ignorira SIGCHLD signale, to je pobijediloNe mogu pomoći. Morat ćete ubiti ili zatvoriti roditeljski proces zombija. Kada proces koji je stvorio zombije završava, init nasljeđuje zombi procesa i postaje njihov novi roditelj.(init je prvi proces pokrenut na Linuxu pri dizanju i dodjeljuje se PID 1.) init periodično izvršava čekanje() poziv sustava za čišćenje svoje zombičke djece, tako da init će napraviti kratki rad zombija. Možete ponovno pokrenuti roditeljski postupak nakon zatvaranja.
Ako roditeljski proces nastavi stvarati zombije, trebao bi biti fiksiran tako da pravilno poziva čekati() da žanje svoje zombije. Datoteku prijavite ako program na vašem sustavu nastavi stvarati zombije.