Što je “zombi proces” na Linuxu?
Ako ste korisnik Linuxa, možda ste vidjeli zombi procese koji se šalju oko popisa vaših procesa. Ne možete ubiti zombi proces jer je već mrtav - kao stvarni zombi.
Zombiji su u osnovi ostaci mrtvih procesa koji nisu ispravno očišćeni. Program koji stvara zombi procese nije ispravno programiran - programi ne bi trebali dopustiti da se zombi procesi zadrže.
Zasluge za sliku: Daniel Hollister na Flickru (remixed)
Što je Zombi proces?
Da biste razumjeli što je zombi proces i što uzrokuje pojavu zombi procesa, morat ćete malo razumjeti kako procesi funkcioniraju na Linuxu.
Kada proces umre na Linuxu, nije odmah uklonjen iz memorije - njegov deskriptor procesa ostaje u memoriji (deskriptor procesa uzima samo malu količinu memorije). Status procesa postaje EXIT_ZOMBIE, a roditelj procesa je obaviješten da je njegov proces djeteta umro sa signalom SIGCHLD. Roditeljski proces bi tada trebao izvršiti sistemski poziv wait () kako bi pročitao izlazni status mrtvog procesa i druge informacije. To omogućuje nadređenom procesu da dobije informacije iz mrtvog procesa. Nakon poziva () čeka se zombi proces potpuno uklonjen iz memorije.
To se obično događa vrlo brzo, tako da nećete vidjeti da se zombi procesi nakupljaju na vašem sustavu. Međutim, ako nadređeni proces nije ispravno programiran i ne poziva poziv wait (), njegova će se zombi djeca zadržati u memoriji dok se ne očiste.
Uslužni programi poput GNOME Monitor sustava, vrh naredbu i p.s naredba prikazati zombi procese.
Opasnosti od zombi procesa
Zombi procesi ne troše sistemske resurse. (Zapravo, svaki od njih koristi vrlo malu količinu memorije sustava za pohranu svog deskriptora procesa.) Međutim, svaki zombi proces zadržava svoj ID procesa (PID). Linux sustavi imaju konačan broj procesnih ID-ova - 32767 prema 32-bitnim sustavima. Ako se zombiji gomilaju vrlo brzo - na primjer, ako nepravilno programirani poslužiteljski softver stvara zombi procese pod opterećenjem - cijeli skup dostupnih PID-ova će na kraju postati dodijeljen zombi procesima, sprečavajući pokretanje drugih procesa.
Međutim, nekoliko zombi procesa koji se vrte okolo nisu problem - iako oni ukazuju na bug s njihovim nadređenim procesom na vašem sustavu.
Osloboditi se zombi procesa
Ne možete ubiti zombi procese kao što možete ubiti normalne procese sa SIGKILL signalom - zombi procesi su već mrtvi. Imajte na umu da ne morate riješiti zombi procese osim ako imate veliki iznos na vašem sustavu - nekoliko zombija su bezopasni. Međutim, postoji nekoliko načina na koje možete riješiti zombi procese.
Jedan od načina je slanje SIGCHLD signala na nadređeni proces. Ovaj signal govori nadređenom procesu da izvrši poziv na čekanje () i očisti svoje zombi djecu. Pošaljite signal sa ubiti naredba, zamjena pid u naredbi ispod s PID nadređenog procesa:
ubio-SIGCHLD pid
Međutim, ako nadređeni proces nije pravilno programiran i ignorira SIGCHLD signale, to neće pomoći. Morat ćete ubiti ili zatvoriti roditeljski proces zombija. Kada se proces koji je stvorio zombije završi, init nasljeđuje zombi procese i postaje njihov novi roditelj. (init je prvi proces koji je započeo na Linuxu pri dizanju i dodijeljen mu je PID 1.) init povremeno izvršava poziv na čekanju () kako bi očistio svoju zombi djecu, tako da će init napraviti kratki rad zombija. Nakon što ga zatvorite, možete ponovno pokrenuti nadređeni proces.
Ako nadređeni proces nastavi stvarati zombije, trebao bi biti popravljen tako da ispravno poziva wait () kako bi požnjeo svoju zombi djecu. Podnesite izvješće o pogrešci ako program na vašem sustavu stalno stvara zombije.