Procese zombie în Linux: Găsire, eliminare, prevenire

15 min citire - 19 mai 2026

hero section cover
Cuprins
  • Procesele zombie în Linux: cum să le găsiți și să le eliminați
  • De ce procesele zombie sunt importante pe servere
  • Cum să găsiți procesele zombie
  • Cum se elimină procesele zombie
  • Prevenirea proceselor zombie
  • Concluzie
Distribuie

Aflați cum să identificați, să eliminați și să preveniți procesele zombie în Linux. Comenzi, corecturi de cod și sfaturi de monitorizare pentru administratorii de servere.

Procesele zombie în Linux: cum să le găsiți și să le eliminați

Un proces zombie este un proces secundar care a terminat de rulat, dar ocupă în continuare un slot în tabelul de procese al kernelului. Acesta există deoarece procesul părinte nu a apelat wait() pentru a colecta starea sa de ieșire. Procesele zombie nu consumă CPU sau memorie, dar fiecare deține un PID. Dacă se acumulează suficient de multe, sistemul dvs. nu va mai putea genera procese noi. Acest articol prezintă modul în care le puteți identifica, elimina și împiedica să apară de la bun început.


 

De ce procesele zombie sunt importante pe servere

Un singur proces zombie este inofensiv. Problema începe când se acumulează. Linux are un spațiu PID finit: 32.768 pe sistemele pe 32 de biți, până la 4.194.304 pe cele pe 64 de biți. Dacă procesele zombie umplu tabelul de procese, kernelul nu poate crea procese noi. Asta înseamnă că nu se pot face conexiuni noi, nu se pot crea fire de lucru noi, nimic nou.

Serverele web precum Apache și Nginx sunt deosebit de expuse, deoarece creează procese secundare pentru a gestiona traficul. Testele de performanță au arătat o scădere de 48% a debitului atunci când procesele zombie se acumulează pe un server web aglomerat. În 2019, o scurgere de canal Golang într-un pod DNS Kubernetes a creat peste 26.000 de procese zombie pe un singur nod, umplând tabelul de procese și blocând rezoluția DNS la nivel de cluster.

Tabelul de mai jos prezintă diferențele cheie dintre un proces normal și un zombie:

CaracteristicăProces normalProces zombie
Simbol de stareR, S, D sau TZ (inactiv)
CPU / MemorieUtilizare activă0% / 0 (deja terminat)
Intrare în tabelul de proceseUn slotUn slot
Răspuns la kill -9Se încheie imediatFără efect (deja mort)
Memoria kerneluluiDescriptor de proces completDoar stare de ieșire minimă

Concluzia esențială: nu poți kill -9 un proces zombie. Acesta este deja mort. Singura modalitate de a-l șterge este să faci procesul părinte să-l recupereze sau să omori procesul părinte, astfel încât init (PID 1) să îl moștenească și să îl recupereze automat.

Cum să găsiți procesele zombie

Procesele zombie apar cu un Z în coloana STAT și <defunct> lângă numele comenzii. Afișați-le cu:

ps aux | grep -w Z

Pentru a vedea ID-ul procesului părinte (PPID), de care veți avea nevoie pentru eliminare:

ps -eo pid,ppid,stat,comm | grep -w Z

Comanda top raportează, de asemenea, numărul total de procese zombie în linia de antet. Pentru o verificare rapidă, neinteractivă:

top -bn1 | grep zombie

Urmărirea procesului părinte cu pstree

Odată ce aveți PID-ul unui proces zombie, urmăriți-l până la procesul părinte responsabil:

pstree -p -s <zombie_pid>

Aceasta afișează arborele genealogic complet de la init până la procesul zombie. Dacă pstree nu este instalat, ps auxf oferă o vizualizare similară a arborelui ASCII.

Numărarea zombiilor pentru monitorizare

O numărare curată care exclude procesul grep în sine:

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Pentru monitorizare continuă în timpul depanării:

watch -n 1 'ps aux | grep -w Z | wc -l'

Cum se elimină procesele zombie

Procesele zombie pot fi eliminate numai prin colectarea stării lor de ieșire. Asta înseamnă să se lucreze prin procesul părinte.

1. Găsiți procesul părinte.

ps -o ppid= -p <zombie_pid>

2. Semnalizați procesului părinte să-și elimine procesele fiice.

kill -SIGCHLD <parent_pid>

Acest lucru îi spune procesului părinte să apeleze wait() pentru orice proces secundar terminat. Această operațiune nu provoacă întreruperi și funcționează cu aplicațiile care se comportă corespunzător.

3. Dacă SIGCHLD nu funcționează, reporniți serviciul.

systemctl restart <service_name>

4. Dacă părintele nu răspunde, omoară-l.

kill <parent_pid>

Sau dacă ignoră SIGTERM:

kill -9 <parent_pid>

Când procesul părinte se închide, init (PID 1) sau systemd adopta procesele zombie orfane și le elimină imediat. Aveți grijă în sistemele de producție. Oprirea procesului părinte termină, de asemenea, toate procesele sale active.

5. Verificați curățarea.

ps aux | awk '$8 ~ /Z/ {count++} END {print count+0}'

Dacă numărul este 0, totul este în regulă.

Prevenirea proceselor zombie

Gestionați procesele secundare în codul dvs.

Cauza principală a majorității acumulărilor de procese zombie este un proces părinte care nu apelează niciodată wait(). Remediați problema la sursă:

  • C: Setați signal(SIGCHLD, SIG_IGN); pentru a ignora automat informațiile de ieșire ale proceselor-copil sau folosiți un handler de semnal cu waitpid(-1, NULL, WNOHANG) pentru a recolta asincron.
  • Python: Utilizați subprocess.run(), care așteaptă automat. Dacă utilizați Popen, apelați proc.wait() în mod explicit.
  • Bash: Adăugați wait la sfârșitul scripturilor care lansează sarcini în fundal.

Configurați corect systemd

Pentru serviciile gestionate de systemd, aceste setări împiedică acumularea de procese zombie:

  • KillMode=control-group asigură că toate procesele fiice sunt terminate împreună atunci când serviciul se oprește.
  • TimeoutStopSec oferă procesului părinte timp să recupereze procesele fiice înainte ca systemd să trimită SIGKILL.
  • WatchdogSec reporneste automat serviciile care nu raspund, detectand cazurile in care procesul părinte se blocheaza si inceteaza sa recupereze procesele copil.

Monitorizați tabelul de procese

Configurați o sarcină cron care rulează la fiecare 15 minute pentru a număra procesele zombie și a alerta dacă numărul depășește un prag:

ps aux | awk '$8 ~ /Z/' | wc -l

Monitorizați, de asemenea, utilizarea tabelului de procese comparând numărul curent cu /proc/sys/kernel/pid_max. Dacă depășește 80%, investigați înainte să devină o problemă. Câțiva zombi tranzitorii în timpul funcționării normale nu sunt un motiv de îngrijorare. Un număr în creștere care nu revine la zero indică o eroare de aplicație care trebuie remediată.

Concluzie

Procesele zombie sunt procese moarte care nu au fost curățate. Ele nu utilizează CPU sau memorie, dar ocupă PID-uri, iar o tabelă de procese plină împiedică serverul să facă ceva util.

  • Găsiți-le cu ps aux | grep -w Z și urmăriți procesul părinte cu pstree.
  • Eliminați-le trimițând SIGCHLD către procesul părinte, repornind serviciul sau, în ultimă instanță, terminând procesul părinte.
  • Preveniți-le scriind cod care apelează wait(), configurând corect systemd și monitorizând tabelul de procese.

Dacă rulați sarcini de lucru cu trafic intens și aveți nevoie de o infrastructură fiabilă cu acces root complet, serverele dedicate FDC vă oferă control deplin asupra gestionării proceselor și configurării sistemului.

Blog

În prim plan săptămâna aceasta

Mai multe articole
Procese zombie în Linux: Găsire, eliminare, prevenire

Procese zombie în Linux: Găsire, eliminare, prevenire

Aflați cum să identificați, să eliminați și să preveniți procesele zombie în Linux. Comenzi, corecturi de cod și sfaturi de monitorizare pentru administratorii de servere.

15 min citire - 19 mai 2026

Lista de verificare pentru întărirea serverului Linux

15 min citire - 8 mai 2026

Mai multe articole
background image

Aveți întrebări sau aveți nevoie de o soluție personalizată?

icon

Opțiuni flexibile

icon

Acoperire globală

icon

Implementare instantanee

icon

Opțiuni flexibile

icon

Acoperire globală

icon

Implementare instantanee