Co je zombie proces na Linuxu?
Pokud jste uživatel Linuxu, pravděpodobně jste zaznamenali zombie procesy kolem vašeho seznamu procesů. Nemůžete zabít zombie proces, protože je už mrtvý - jako skutečný zombie.
Zombie jsou v podstatě zbývající kousky mrtvých procesů, které nebyly řádně vyčištěny. Program, který vytváří zombie procesy, není správně naprogramován - programy by neměly umožňovat zombie procesům.
Image Credit: Daniel Hollister na Flickru (Remixed)
Co je zombie proces??
Chcete-li pochopit, co je proces zombie a co způsobuje zombie procesy, které se objeví, budete muset trochu porozumět tomu, jak fungují procesy na Linuxu.
Když proces umírá v systému Linux, není vše z paměti okamžitě odstraněno - jeho deskriptor procesu zůstává v paměti (deskriptor procesu přijímá pouze malé množství paměti). Stav procesu se stává EXIT_ZOMBIE a rodiče procesu je informován o tom, že jeho podřízený proces zemřel pomocí signálu SIGCHLD. Rodičovský proces má potom provést systémový hovor wait (), aby si přečetl stav ukončení mrtvého procesu a další informace. To umožňuje rodičovskému procesu získat informace z mrtvého procesu. Po volání wait () je proces zombie úplně odstraněn z paměti.
To se obvykle stává velmi rychle, takže na vašem systému nebudete hromadit procesy zombie. Pokud však rodičovský proces není správně naprogramován a nikdy neumí volat wait (), jeho zombie děti budou držet v paměti, dokud nebudou vyčištěny.
Nástroje jako GNOME System Monitor, horní příkazu a příkazu ps příkaz zobrazení zombie procesů.
Nebezpečí zombie procesů
Zombie procesy nevyužívají žádné systémové zdroje. (Ve skutečnosti každá z nich používá velmi malé množství systémové paměti pro ukládání svého deskriptoru procesu.) Každý proces zombie však uchovává své ID procesu (PID). Systémy Linux mají konečný počet procesních ID - 32767 ve výchozím nastavení na 32bitových systémech. Pokud se zombie hromadí velmi rychle - například když nesprávně naprogramovaný serverový software vytváří zombie procesy pod zatížením - celá skupina dostupných PID bude nakonec přidělena procesům zombie, což zabrání spuštění jiných procesů.
Nicméně několik zombie procesů visí kolem není žádný problém - ačkoli oni ukazují chybu s jejich rodičovský proces ve vašem systému.
Zbavte se zombie procesů
Nemůžete zabít zombie procesy, protože můžete zabít normální procesy se signálem SIGKILL - zombie procesy jsou již mrtvé. Mějte na paměti, že se nemusíte zbavovat zombie procesů, pokud nemáte velké množství na vašem systému - několik zombie je neškodné. Existuje však několik způsobů, jak se zbavit zombie procesů.
Jedním ze způsobů je odeslání signálu SIGCHLD do nadřazeného procesu. Tento signál říká, že rodičovský proces provádí systémový hovor wait () a vyčistí jeho děti zombie. Odeslat signál pomocí tlačítka zabít příkaz, nahrazení pid v příkazu s PID nadřazeného procesu:
zabít -s SIGCHLD pid
Nicméně pokud mateřský proces není naprogramován správně a ignoruje signály SIGCHLD, nepomůže to. Budete muset zabít nebo zavřít nadřazený proces zombie. Když proces, který vytvořil zombie, skončí, init zdědí zombie procesy a stane se jejich novým rodičem. (init je první proces, který byl spuštěn na Linuxu při zavádění a je mu přidělen PID 1.) Init periodicky provádí čekací () systémový hovor k vyčištění svých zombie dětí, takže init bude krátkou práci zombie. Po ukončení rodičovského procesu můžete restartovat.
Pokud nadřazený proces nadále vytváří zombie, měl by být pevně nastaven tak, aby správně volal wait (), aby sklízel své zombie děti. Nahrajte zprávu o chybě, pokud program ve vašem systému stále vytváří zombie.