Ce este un proces zombie pe Linux?
Dacă sunteți utilizator Linux, este posibil să fi văzut procese zombie în jurul listei de procese. Nu poți ucide un proces zombie, pentru că e deja mort - ca un zombie reală.
Zombii 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)
Ce este un proces zombie?
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 funcționează 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 copilului său 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 rapid, 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.
Pericolele proceselor zombie
Procesele zombie nu folosesc resursele de sistem. (De fapt, fiecare utilizează o cantitate foarte mică de memorie de sistem pentru a-și păstra descriptorul de proces). 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 sisteme 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 acestea indică un bug cu procesul părintelui în sistemul dvs..
Scapa de procesele zombie
Nu puteți ucide procesele zombie deoarece puteț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 pe sistemul dvs. - câteva zombi sunt inofensive. Cu toate acestea, există câteva moduri în care puteți scăpa de procesele zombie.
O modalitate este trimiterea semnalului SIGCHLD la procesul părinte. Acest semnal îi spune 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 zombiile se termină, init moștenește procesele zombie și devine noul lor părinte. (init este primul proces inceput pe Linux la boot si este atribuit PID 1.) init executa periodic apelul wait () pentru a-si curata copiii zombie, asa ca init va face munca scurta 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 () pentru a culege copiii zombie. Trimiteți un raport de eroare dacă un program din sistemul dvs. continuă să creeze zombi.