Dacă sunteți utilizator Linux, este posibil să fi văzut procese zombie în jurul listei de procese. Nu puteți ucide un proces zombie deoarece este deja mort - ca un zombie reală.
Zombiții sunt practic biții rămași ai proceselor moarte care nu au fost curățate în mod corespunzător. Un program care creează procese zombie nu este programat în mod corespunzător - programele nu ar trebui să lase procesele zombie să rămână în jur.
Image Credit: Daniel Hollister pe Flickr (Remixed)
Pentru a înțelege ce este un proces zombie și ce cauzează procesele zombie, va trebui să înțelegeți puțin despre modul în care procesele lucrează pe Linux.
Când un proces moare pe Linux, acesta nu este îndepărtat imediat din memorie - descriptorul său de proces rămâne în memorie (descriptorul de proces are nevoie doar de o cantitate mică de memorie). Starea procesului devine EXIT_ZOMBIE iar părintele procesului este informat că procesul său copil a murit cu semnalul SIGCHLD. Procesul-mamă trebuie să execute apelul de așteptare () pentru a citi starea de ieșire a procesului mort și alte informații. Acest lucru permite procesului părinte să obțină informații din procesul mort. După ce se apelează așteptați (), procesul zombie este complet eliminat din memorie.
Acest lucru se întâmplă în mod normal foarte repede, astfel încât nu veți vedea procese zombie care se acumulează în sistemul dvs. Cu toate acestea, dacă un proces părinte nu este programat în mod corespunzător și niciodată nu așteaptă așteptați (), copiii lui zombie vor rămâne în memorie până când vor fi curățiți.
Utilitare cum ar fi GNOME System Monitor, top comandă și ps comanda afișa procese zombie.
Procesele zombie nu folosesc resursele sistemului. (De fapt, fiecare utilizează o cantitate foarte mică de memorie de sistem pentru a-și stoca descriptorul procesului). Cu toate acestea, fiecare proces zombie își păstrează ID-ul procesului (PID). Sistemele Linux au un număr finit de ID-uri de proces - 32767 în mod implicit pe sistemele pe 32 de biți. Dacă zombi se acumulează la o viteză foarte rapidă - de exemplu, dacă software-ul de server programat necorespunzător creează procese zombie sub sarcină - întregul pool de PID-uri disponibile va deveni în cele din urmă atribuite proceselor zombie, împiedicând lansarea altor procese.
Cu toate acestea, câteva procese zombie agățate în jur nu reprezintă o problemă - deși indică un bug cu procesul părinte în sistemul dvs.
Nu poți ucide procesele zombie, deoarece poți ucide procesele normale cu semnalul SIGKILL - procesele zombie sunt deja moarte. Rețineți că nu aveți nevoie să scăpați de procese zombie decât dacă aveți o cantitate mare în sistemul dvs. - câteva zombi sunt inofensive. Cu toate acestea, există câteva moduri de a scăpa de procesele zombie.
O modalitate este trimiterea semnalului SIGCHLD la procesul părinte. Acest semnal indică procesului părinte să execute apelul de așteptare () și să-și curețe copiii zombie. Trimiteți semnalul cu ucide comandă, înlocuire pid în comanda de mai jos cu PID-ul procesului părinte:
ucide-s SIGCHLD pid
Cu toate acestea, dacă procesul părinte nu este programat corect și ignoră semnalele SIGCHLD, acest lucru nu va ajuta. Va trebui să ucizi sau să închizi procesul părintelui zombie. Când procesul care a creat zombii se termină, init moștenește procesele zombie și devine noul lor părinte. (init este primul proces pornit pe Linux la boot și este atribuit PID 1.) init execută periodic apelul de așteptare () pentru a-și curăța copiii zombie, așa că init va face munca scurtă a zombiilor. Puteți restarta procesul parental după închiderea acestuia.
Dacă un proces părinte continuă să creeze zombi, ar trebui să fie fixat astfel încât să îl apeleze în mod corespunzător așteptați () pentru a culege copiii zombie. Trimiteți un raport de eroare dacă un program din sistemul dvs. continuă să creeze zombi.