Zombie procesy v Linuxu: Zkušební procesy: Najít, odstranit, zabránit

15 min čtení - 19. května 2026

hero section cover
Obsah
  • Zombie procesy v Linuxu: Jak je najít a odstranit
  • Proč jsou zombie procesy na serverech důležité
  • Jak najít zombie procesy
  • Jak odstranit zombie procesy
  • Prevence zombie procesů
  • Závěr
Sdílet

Naučte se, jak v systému Linux identifikovat zombie procesy, odstraňovat je a předcházet jim. Příkazy, opravy kódu a tipy pro monitorování pro správce serverů.

Zombie procesy v Linuxu: Jak je najít a odstranit

Zombie proces je potomkový proces, který dokončil své provádění, ale stále zabírá místo v tabulce procesů jádra. Existuje proto, že rodičovský proces nezavolal wait() k získání jeho výstupního stavu. Zombie nespotřebovávají CPU ani paměť, ale každý z nich drží PID. Nechte jich nahromadit dost a váš systém nebude moci spouštět nové procesy. Tento příspěvek se zabývá tím, jak je odhalit, odstranit a zabránit jejich vzniku.


 

Proč jsou zombie procesy na serverech důležité

Jeden zombie proces je neškodný. Problém nastává, když se začnou hromadit. Linux má omezený prostor pro PID: 32 768 na 32bitových systémech, až 4 194 304 na 64bitových. Pokud zombie procesy zaplní tabulku procesů, jádro nemůže vytvářet nové procesy. To znamená žádné nové připojení, žádná nová pracovní vlákna, prostě nic nového.

Webové servery jako Apache a Nginx jsou obzvláště ohroženy, protože vytvářejí podprocesy pro zpracování provozu. Benchmarky ukázaly 48% pokles propustnosti, když se zombie hromadí na vytíženém webovém serveru. V roce 2019 vytvořila únik kanálu Golang v podu DNS Kubernetes přes 26 000 zombie na jediném uzlu, čímž zaplnila tabulku procesů a způsobila selhání DNS v celém clusteru.

Níže uvedená tabulka ukazuje klíčové rozdíly mezi normálním procesem a zombie:

CharakteristikaNormální procesZombie proces
Symbol stavuR, S, D nebo TZ (nefunkční)
CPU / PaměťAktivní využití0 % / 0 (již ukončeno)
Záznam v tabulce procesůJeden slotJeden slot
Odpověď na kill -9Okamžité ukončeníŽádný účinek (již nefunkční)
Paměť jádraPlný deskriptor procesuPouze minimální stav ukončení

Zásadní poznatek: nemůžete kill -9 zombie. Je již mrtvá. Jediným způsobem, jak ji vymazat, je nechat ji sklidit rodičovským procesem, nebo zabít rodiče, aby init (PID 1) ho automaticky zdědí a sklidí.

Jak najít zombie procesy

Zombie se zobrazují s písmenem Z ve sloupci STAT a <defunct> vedle názvu příkazu. Seznamte je pomocí:

ps aux | grep -w Z

Chcete-li zobrazit ID nadřazeného procesu (PPID), které budete potřebovat k odstranění:

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

Příkaz top příkaz také uvádí celkový počet zombie v záhlaví. Pro rychlou neinteraktivní kontrolu:

top -bn1 | grep zombie

Sledování rodičovského procesu pomocí pstree

Jakmile máte PID zombie, vysledujte jej zpět k odpovědné rodičovské instanci:

pstree -p -s <zombie_pid>

Tím se zobrazí celý rodokmen od init až po zombie. Pokud pstree není nainstalován, ps auxf poskytuje podobný ASCII stromový náhled.

Počítání zombie pro monitorování

Čistý počet, který vylučuje samotný proces grep:

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

Pro nepřetržité monitorování během řešení problémů:

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

Jak odstranit zombie procesy

Zombie lze odstranit pouze shromážděním jejich výstupního stavu. To znamená pracovat přes nadřazený proces.

1. Najděte rodičovský proces.

ps -o ppid= -p <zombie_pid>

2. Dejte rodičovskému procesu signál, aby sklidil své potomky.

kill -SIGCHLD <parent_pid>

Tím se rodiči řekne, aby zavolal wait() u všech ukončených potomků. Je to nenarušující a funguje to u aplikací, které se chovají správně.

3. Pokud SIGCHLD nefunguje, restartujte službu.

systemctl restart <service_name>

4. Pokud rodič nereaguje, ukončete jej.

kill <parent_pid>

Nebo pokud ignoruje SIGTERM:

kill -9 <parent_pid>

Když rodič zemře, init (PID 1) nebo systemd převzala osiřelé zombie a okamžitě je sklidila. Buďte opatrní na produkčních systémech. Ukončení rodičovského procesu také ukončí všechny jeho aktivní potomky.

5. Ověřte vyčištění.

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

Pokud je počet 0, je vše v pořádku.

Prevence zombie procesů

Zpracování podřízených procesů ve vašem kódu

Hlavní příčinou většiny nahromadění zombie procesů je rodičovský proces, který nikdy nezavolá wait(). Opravte to u zdroje:

  • C: Nastavte signal(SIGCHLD, SIG_IGN); tak, aby automaticky zahazoval informace o ukončení potomků, nebo použijte obslužnou funkci signálu s waitpid(-1, NULL, WNOHANG) k asynchronnímu sklízení.
  • Python: Použijte subprocess.run(), který čeká automaticky. Pokud používáte Popen, zavolejte proc.wait() explicitně.
  • Bash: Přidejte wait na konec skriptů, které spouštějí úlohy na pozadí.

Správně nakonfigurujte systemd

U služeb spravovaných systémem systemd tato nastavení zabraňují hromadění zombie procesů:

  • KillMode=control-group zajišťuje, že všechny podřízené procesy budou ukončeny společně, když se služba zastaví.
  • TimeoutStopSec dává rodičovskému procesu čas na sklizeň potomků, než systemd odešle SIGKILL.
  • WatchdogSec automaticky restartuje nereagující služby, zachytí případy, kdy se nadřazený proces zasekne a přestane je ukončovat.

Sledujte tabulku procesů

Nastavte cron úlohu, která se spouští každých 15 minut, aby spočítala zombie a upozornila, pokud počet překročí prahovou hodnotu:

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

Sledujte také využití tabulky procesů porovnáním aktuálního počtu s /proc/sys/kernel/pid_max. Pokud překročí 80 %, prošetřete to, než se to stane problémem. Několik přechodných zombie během normálního provozu není důvod k obavám. Rostoucí počet, který neklesá zpět na nulu, ukazuje na chybu v aplikaci, kterou je třeba opravit.

Závěr

Zombie procesy jsou mrtvé procesy, které nebyly odstraněny. Nepoužívají CPU ani paměť, ale zabírají PID a plná tabulka procesů brání serveru v provádění jakýchkoli užitečných činností.

  • Najděte je pomocí ps aux | grep -w Z a vysledujte rodičovský proces pomocí pstree.
  • Odstraňte je zasláním SIGCHLD na rodičovský proces, restartováním služby nebo v krajním případě zabitím rodičovského procesu.
  • Prevenci zajistíte napsáním kódu, který volá wait(), správnou konfigurací systemd a sledováním tabulky procesů.

Pokud provozujete pracovní úlohy s vysokým provozem a potřebujete spolehlivou infrastrukturu s plným root přístupem, dedikované servery FDC vám poskytnou plnou kontrolu nad správou procesů a konfigurací systému.

Blog

Tento týden byly představeny

Další články
Zombie procesy v Linuxu: Zkušební procesy: Najít, odstranit, zabránit

Zombie procesy v Linuxu: Zkušební procesy: Najít, odstranit, zabránit

Naučte se, jak v systému Linux identifikovat zombie procesy, odstraňovat je a předcházet jim. Příkazy, opravy kódu a tipy pro monitorování pro správce serverů.

15 min čtení - 19. května 2026

Kontrolní seznam zabezpečení linuxových serverů

15 min čtení - 8. května 2026

Další články
background image

Máte dotazy nebo potřebujete vlastní řešení?

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení