20Aug

Co je "zombie proces" na Linuxu?

click fraud protection

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 již mrtvý - jako skutečný zombie.

Zombie jsou v podstatě zbývající bity mrtvých procesů, které nebyly řádně vyčištěny. Program, který vytváří zombie procesy, není správně naprogramován - programy nemají zabránit tomu, aby se zombie procesy držely kolem.

Image Credit: Daniel Hollister na Flickr( Remixed)

Co je to zombie proces?

Chcete-li porozumět tomu, co je zombie proces a co způsobuje zombie procesy se objeví, budete muset trochu pochopit, jak procesy pracují na Linuxu.

Když proces umírá v systému Linux, není to z paměti okamžitě odstraněno - jeho deskriptor procesu zůstává v paměti( deskriptor procesu přijímá jen malé množství paměti).Stav procesu se stává EXIT_ZOMBIE a nadřazený proces je oznamován, ž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 zcela vymazán z paměti.

instagram viewer

Obvykle se to stane velmi rychle, takže na vašem systému nebudete hromadit procesy zombie. Nicméně pokud 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 je GNOME System Monitor, vrchní příkaz a příkaz ps zobrazují zombie procesy.

Nebezpečí zombie Procesy

Zombie nevyužívají žádné systémové zdroje.(Ve skutečnosti každý z nich používá velmi malé množství systémové paměti pro uložení svého deskriptoru procesu.) Každý proces zombie si však udrží 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 pokud 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 zombijských procesů

Nemůžete zabíjet 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 na vašem systému velké množství - několik zombií je neškodné.Existuje však několik způsobů, jak se zbavit zombie procesů.

Jednou cestou je odeslání signálu SIGCHLD do rodičovského procesu. Tento signál říká, že rodičovský proces provádí čekací() systémové volání a vyčistí jeho děti zombie. Odeslat signál pomocí příkazu kill , nahrazením pid v příkazu dole s PID rodičovského procesu:

kill -s SIGCHLD pid

Pokud však rodičovský proces není správně naprogramován a ignoruje signály SIGCHLD,Nepomůžeš.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 spuštění a byl 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 nastaven tak, aby správně volal wait() , aby sklízel své děti zombie. Nahrajte hlášení o chybě, pokud program ve vašem systému stále vytváří zombie.