Cum să ucizi procesele zombie pe Linux

O fereastră de terminal pe un laptop Linux.

Fatmawati Achmad Zaenuri/Shutterstock



Programele care sunt scrise prost sau care funcționează prost pot pleca procese zombie pândind în interiorul computerului tău Linux. Aflați cum sunt creați zombii și cum îi puteți odihni în cele din urmă.

Cum funcționează statele de proces pe Linux

Linux, desigur, trebuie să urmărească toate aplicațiile și demonii care rulează pe computerul tău. Una dintre modalitățile prin care face acest lucru este prin menținerea tabelului de proces. Aceasta este o listă de structuri din memoria kernelului. Fiecare proces are o intrare în această listă care conține câteva informații despre acesta.





Nu există mare lucru în fiecare dintre structurile tabelului de proces. Ei țin ID proces , alte câteva elemente de date și un indicator către blocul de control al procesului (PCB) pentru acel proces.

Este PCB-ul care deține multe detalii pe care Linux trebuie să le caute sau să le stabilească pentru fiecare proces. PCB-ul este, de asemenea, actualizat pe măsură ce se creează un proces, se acordă timp de procesare și, în final, este distrus.



PCB-ul Linux conține peste 95 de câmpuri. Este definit ca o structură numită |_+_| și are peste 700 de linii. PCB-ul conține următoarele tipuri de informații:

    Starea procesului: Stările sunt descrise mai jos. Numărul procesului: identificatorul său unic în cadrul sistemului de operare. Contor de programe: Când acest proces primește acces la CPU, sistemul va folosi această adresă pentru a găsi următoarea instrucțiune a procesului care ar trebui să fie executată. Registrele: Lista registrelor CPU utilizate de acest proces. Lista poate conține acumulatori, registre de index și indicatori de stivă. Deschideți Lista de fișiere: Fișiere asociate cu acest proces. Informații de programare CPU: Folosit pentru a determina cât de des și pentru cât timp este acordat acestui proces timpul de procesare CPU. Prioritatea procesului, indicatorii către cozile de programare și alți parametri de programare trebuie să fie înregistrate în PCB. Informații de gestionare a memoriei: Detalii despre memoria pe care o folosește acest proces, cum ar fi adresele de început și de sfârșit ale memoriei de proces și indicatorii către paginile de memorie. Informații despre starea I/O: Orice dispozitive de intrare sau de ieșire utilizate de proces.

Starea procesului poate fi oricare dintre următoarele:

    R:Un proces care rulează sau poate rula. Rulează, ceea ce înseamnă că primește cicluri CPU și se execută. Un proces care poate fi rulat este gata de rulare și așteaptă un slot pentru procesor. S:Un proces de somn. Procesul așteaptă finalizarea unei acțiuni, cum ar fi o operație de intrare sau de ieșire, sau ca o resursă să devină disponibilă. D:Procesul se află într-o stare de somn neîntreruptibil. Utilizează un apel de sistem de blocare și nu poate continua până când apelurile de sistem nu sunt finalizate. Spre deosebire de starea Sleep, un proces în această stare nu va răspunde la semnale până când apelul de sistem este finalizat și execuția nu va reveni la proces. T:Procesul s-a încheiat (s-a oprit) deoarece a primit |_+_| semnal. Aceasta va răspunde doar la |_+_| sau |_+_| semnale, care fie ucid procesul, fie îl instruiesc să continue. Asta se întâmplă când schimbi de la prim-plan (|_+_|) la fundal (|_+_| sarcini. CU:Un proces zombie. Când un proces se termină, el nu dispare pur și simplu. Eliberează orice memorie pe care o folosește și se îndepărtează singur din memorie, dar intrarea sa în tabelul de proces și PCB rămân. Starea sa este setată la |_+_|, iar procesul părinte este notificat (prin semnalul |_+_|) că procesul copil s-a terminat.
Publicitate

În starea Zombie, procesul părinte apelează unul dintre |_+_| familii de funcţii când este creat procesul copil. Apoi așteaptă o schimbare de stare a procesului copil. Procesul copil a fost oprit, continuat sau ucis de un semnal? S-a terminat prin trecerea la finalizarea firească a codului său?



Dacă schimbarea stării este una care înseamnă că procesul copil a încetat să ruleze, este citit codul său de ieșire. Apoi, PCB-ul copilului este distrus și intrarea lui în tabelul de proces este eliminată. În mod ideal, toate acestea se întâmplă într-o clipă, iar procesele în starea zombie nu există pentru foarte mult timp.

LEGATE DE: Cum să rulați și să controlați procesele de fundal pe Linux

Ce cauzează procesele zombie pe Linux?

Un proces părinte scris prost ar putea să nu apeleze |_+_| funcția atunci când este creat procesul copil. Aceasta înseamnă că nimic nu urmărește schimbările de stare în procesul copil și |_+_| semnalul va fi ignorat. Sau, poate că o altă aplicație afectează execuția procesului părinte, fie din cauza programării proaste, fie din cauza intenției rău intenționate.

Cu toate acestea, dacă procesul părinte nu urmărește schimbările de stare în procesul copil, întreținerea corectă a sistemului nu va avea loc. PCB-ul și intrarea din tabelul de procese nu vor fi eliminate când procesul copil se încheie. Acest lucru duce la faptul că starea zombie nu este niciodată eliminată din PCB.

Zombii folosesc un pic de memorie, dar de obicei nu reprezintă o problemă. Intrarea în tabelul de proces este mică, dar, până când este eliberată, ID-ul procesului nu poate fi reutilizat. Pe un sistem de operare pe 64 de biți, este puțin probabil să provoace probleme, deoarece PCB-ul este mult mai mare decât intrarea în tabelul de proces.

Un număr mare de zombi ar putea, probabil, să afecteze cantitatea de memorie care este liberă pentru alte procese. Dacă aveți atât de mulți zombi, totuși, aveți o problemă serioasă cu aplicația părinte sau cu o eroare a sistemului de operare.

Cum să eliminați procesele zombie

Nu poți ucide un proces zombi pentru că este deja mort. Nu va răspunde la niciun semnal deoarece a fost eliminat din memorie — nu există unde să trimită un |_+_| semnal. Puteți încerca să trimiteți |_+_| semnal către procesul părinte, dar dacă nu a funcționat când procesul copil sa încheiat, este puțin probabil să funcționeze nici acum.

Publicitate

Singura soluție de încredere este să omorâți procesul părinte. Când este terminat, procesele sale secundare sunt moștenite de |_+_| proces, care este primul proces care rulează într-un sistem Linux (ID-ul său de proces este 1).

|_+_| Procesul efectuează în mod regulat curățarea necesară de zombi, așa că pentru a-i ucide, trebuie doar să ucizi procesul care i-a creat. |_+_| comanda este o modalitate convenabilă de a vedea dacă aveți zombi.

Introduceți următoarele:

task_struct.h

Acest sistem are opt procese zombie. Noi pot enumera acestea folosind |_+_| comanda și introducându-l în |_+_|. Din nou, procesele zombie au un steag de stat Z și, de obicei, veți vedea și dispariți.

Introduceți următoarele:

SIGSTOP

Procesele zombie sunt enumerate.

Aceasta este o modalitate mai ordonată de a descoperi ID-urile de proces ale zombilor decât derularea înainte și înapoi prin |_+_|. De asemenea, vedem că o aplicație numită badprg a dat naștere acestor zombi.

ID-ul de proces al primului zombi este 7641, dar trebuie să găsim ID-ul procesului al procesului părinte. Putem face acest lucru folosind |_+_|din nou. Vom folosi opțiunea de ieșire (|_+_|) pentru a spune |_+_| pentru a afișa numai ID-ul de proces al părintelui, apoi transmiteți-l cu |_+_| steag.

Publicitate

Procesul pe care vrem să-l găsim va fi indicat prin utilizarea |_+_| (proces), apoi transmiteți ID-ul de proces al zombiului.

Prin urmare, introducem următoarea comandă pentru a căuta informațiile despre proces pentru procesul 7641, dar va raporta doar ID-ul procesului părinte:

SIGKILL

Ni sa spus că ID-ul procesului părinte este 7636. Acum putem face referințe încrucișate folosind |_+_| inca o data.

Vedem că acesta se potrivește cu numele procesului părinte de mai devreme. Pentru a opri procesul părinte, utilizați opțiunea SIGKILL cu comanda kill după cum urmează:

SIGCONT

În funcție de proprietarul procesului părinte, ar putea fi necesar să utilizați și |_+_|.

Zombii nu sunt înfricoșători...

... cu excepția cazului în care sunt într-o hoardă masivă. Câteva nu sunt de ce să vă faceți griji și o simplă repornire le va șterge.

Publicitate

Cu toate acestea, dacă observați că o aplicație sau un proces generează întotdeauna zombi, ar trebui să vă uitați la asta. Cel mai probabil este doar un program scris neglijent, caz în care, poate că există o versiune actualizată care se curăță în mod corespunzător după procesele sale secundare.

CITEȘTE URMĂTORUL Fotografie de profil pentru Dave McKay Dave McKay
Dave McKay a folosit pentru prima dată computerele când banda de hârtie perforată era în vogă și de atunci programează. După peste 30 de ani în industria IT, acum este jurnalist de tehnologie cu normă întreagă. De-a lungul carierei sale, a lucrat ca programator independent, manager al unei echipe internaționale de dezvoltare de software, manager de proiect pentru servicii IT și, cel mai recent, responsabil cu protecția datelor. Scrisul său a fost publicat de howtogeek.com, cloudsavvyit.com, itenterpriser.com și opensource.com. Dave este un evanghelist Linux și un avocat open source.
Citiți biografia completă

Articole Interesante