Cum să ucizi procesele zombie pe Linux

Publicat: 2022-01-29
O fereastră de terminal pe un laptop Linux.
Fatmawati Achmad Zaenuri/Shutterstock

Programele care sunt scrise prost sau care funcționează prost pot lăsa procesele zombie să pândească î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 tabelelor de proces. Acestea dețin ID-ul procesului, alte câteva elemente de date și un pointer către blocul de control al procesului (PCB) pentru acel proces.

PCB-ul este cel 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ă task_struct.h și are peste 700 de linii. PCB-ul conține următoarele tipuri de informații:

  • Stare proces : stările sunt descrise mai jos.
  • Numărul procesului : identificatorul său unic în cadrul sistemului de operare.
  • Contor program : Când acestui proces i se acordă acces la CPU, sistemul va folosi această adresă pentru a găsi următoarea instrucțiune a procesului care ar trebui să fie executată.
  • Registers : 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 procesului și indicatorii către paginile de memorie.
  • Informații despre starea I/O : orice dispozitiv de intrare sau de ieșire utilizat de proces.

„Starea procesului” poate fi oricare dintre următoarele:

  • R: Un proces care rulează sau se 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 este î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 a revenit la proces.
  • T: Procesul s-a încheiat (s-a oprit) deoarece a primit semnalul SIGSTOP . Acesta va răspunde doar la semnalele SIGKILL sau SIGCONT , care fie opresc procesul, fie îi instruiesc să continue. Acesta este ceea ce se întâmplă atunci când comutați de la sarcinile din prim-plan ( fg ) la sarcinile de fundal ( bg) .
  • Z: Un proces zombi. Când un proces se termină, el nu dispare pur și simplu. Eliberează orice memorie pe care o folosește și se elimină singur din memorie, dar intrarea sa în tabelul de proces și PCB rămân. Starea sa este setată la EXIT_ZOMBIE și procesul părinte este notificat (prin semnalul SIGCHLD ) că procesul copil s-a încheiat.

Publicitate

În starea Zombie, procesul părinte apelează una dintre familiile de funcții wait() atunci 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: 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 wait() atunci când este creat procesul copil. Aceasta înseamnă că nimic nu urmărește schimbările de stare în procesul copil și semnalul SIGCHLD 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, nu va avea loc o întreținere adecvată a sistemului. 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 SIGKILL . Puteți încerca să trimiteți semnalul SIGCHLD către procesul părinte, dar dacă nu a funcționat când s-a terminat procesul copil, 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 procesul init , care este primul proces care rulează într-un sistem Linux (ID-ul său de proces este 1).

Procesul init efectuează în mod regulat curățarea necesară de zombi, așa că pentru a-i ucide, trebuie doar să omorâți procesul care i-a creat. Comanda de top este o modalitate convenabilă de a vedea dacă aveți zombi.

Introduceți următoarele:

 top 

Acest sistem are opt procese zombie. Le putem enumera folosind comanda ps și introducând-o în egrep . Din nou, procesele zombie au un steag de stat „Z” și, de obicei, veți vedea și „defunct”.

Introduceți următoarele:

 ps aux | egrep "Z|defunct" 

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 partea de top . 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 ps . Vom folosi opțiunea de ieșire ( -o ) pentru a-i spune ps să afișeze doar ID-ul de proces al părintelui, apoi îl vom transmite cu steag-ul ppid= .

Publicitate

Procesul pe care vrem să-l găsim va fi indicat prin utilizarea opțiunii -p (proces) și apoi trecând 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:

 ps -o ppid= -p 7641 

Ni s-a spus că ID-ul procesului părinte este 7636. Acum putem face referințe încrucișate folosind ps încă o dată.

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ă:

 ucide -SIGKILL 7636

În funcție de proprietarul procesului părinte, este posibil să fie necesar să utilizați și sudo .

Zombii nu sunt înfricoșători...

... dacă nu fac parte dintr-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ă mereu 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ăță corect după procesele sale secundare.