Ako ste korisnik Linuxa, možda ste vidjeli zombičke procese koji se kriju oko vaših procesnih popisa. Ne možete ubiti zombi jer je već mrtav - poput zombija.
Zombiji su zapravo 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.
Slika: Daniel Hollister na Flickr (Remixed)
Da biste shvatili što je zombi proces i što uzrokuje pojavljivanje zombičkih procesa, morat ćete malo razumjeti kako se procesi rade na Linuxu.
Kada proces umre na Linuxu, nije sve odmah uklonjeno iz memorije - njegov opisni proces ostaje u memoriji (procesni deskriptor zauzima samo malu 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 kao što su GNOME System Monitor, vrh naredba i p.s naredba prikazuje 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.
Ne možete ubiti zombijeve procese jer možete ući u normalne procese SIGKILL signalom - 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. Pošaljite signal s ubiti naredba, zamjena pid u sljedećoj naredbi s PID-om roditeljskog postupka:
ubiti -s SIGCHLD pid
Međutim, ako roditeljski proces nije pravilno programiran i zanemaruje SIGCHLD signale, to neće 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 podizanju sustava i dodjeljuje se PID 1.) init povremeno 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.