Programy, které jsou špatně napsané nebo vystupující špatně mohou odejít Zombie procesy Currking uvnitř počítače Linuxu. Zjistěte si, jak jsou vytvořeny zombie a jak je můžete konečně položit k odpočinku.
Jak fungují procesní stavy na Linuxu
Linux, samozřejmě, musí sledovat všechny aplikace a démony běžící v počítači. Jedním ze způsobů, jak to dělá, je udržováním procesní tabulky. Jedná se o seznam struktur v paměti jádra. Každý proces má záznam v tomto seznamu, který obsahuje některé informace o tom.
V každém z konstrukcí procesních tabulek není velký problém. Drží ID procesu , několik dalších datových položek a ukazatel na řídicí blok procesu (PCB) pro tento proces.
Je to PCB, který drží mnoho podrobností Linux musí vyhledat nebo nastavit pro každý proces. PCB je také aktualizován jako proces byl vytvořen, daný čas zpracování a nakonec zničen.
PCB Linux obsahuje přes 95 polí.
Je to definováno
Jak se nazývá struktura
task_struct.h.
a je to více než 700 řádků. PCB obsahuje následující typy informací:
- Proces procesu : Státy jsou popsány níže.
- Číslo procesu : Jeho jedinečný identifikátor v operačním systému.
- Program Counter. : Pokud je tento proces příští přístup k CPU, systém použije tuto adresu, aby našel další instrukce procesu, který by měl být proveden.
- Registry : Seznam registrů CPU používaných tímto procesem. Seznam může obsahovat akumulátory, rejstříky indexu a ukazatele zásobníku.
- Otevřete seznam souborů : Soubory spojené s tímto procesem.
- Informace o plánování CPU : Používá se k určení, jak často, a jak dlouho se tento proces uděluje doba zpracování CPU. Prioritou procesu, ukazatele k plánování fronty a další parametry plánování musí být zaznamenány v PCB.
- Informace o správě paměti : Podrobnosti o paměti Tento proces používá, například adresy start a koncových adres paměti procesu a ukazatele na stránky paměti.
- Informace o stavu I / O : Jakákoli in-nebo výstupní zařízení používaná způsobem.
"Procesový stav" může být některý z následujících možností:
- R: Běh nebo runnable proces. Běh znamená, že přijímá cykly CPU a provádění. Runnable proces je připraven běžet a čekat na slot CPU.
- S: Proces spaní. Proces čeká na dokončení akce, jako je například in- nebo výstupní operace, nebo pro zdroj, který má být k dispozici.
- D: Proces je v nepřerušitelném stavu spánku. Používá volání blokování systému a nemůže pokračovat, dokud systémové hovory nedokončí. Na rozdíl od stavu spánku "proces v tomto stavu nebude reagovat na signály, dokud nebude systémové volání dokončeno a provedení se vrátilo do procesu.
-
T:
Proces ukončil (zastaven), protože přijal
Sigstop.signál. To bude pouze reagovat naSigkill.neboSigcont.Signály, které buď zabijí proces nebo instruují, aby pokračovaly, resp. To je to, co se děje, když vyměňujete popředí (fg.) na Pozadí (bg)úkoly. -
Z:
Proces zombie. Když proces dokončí, to prostě nezmizí. Uvolňuje jakoukoliv paměť, kterou používá a odstraňuje se z paměti, ale jeho vstup do tabulky procesu a PCB zůstane. Jeho stát je nastaven na
Exit_zombie.a jeho mateřský proces je oznámen (podleSigchld.Signál), že proces dítěte skončil.
Ve stavu zombie, mateřský proces volá jeden z
Počkejte()
rodiny funkcí
při vytváření procesu dítěte. Poté čeká na změnu státu v procesu dítěte. Byl proces dítěte zastaven, pokračoval nebo zabil signálem? Ukončila to tím, že běží při přirozeném dokončení svého kodexu?
Pokud je změna stavu, což znamená, že proces dítěte přestal spustit, jeho výstupní kód je čten. Poté je Dětský PCB zničen a jeho vstup do tabulky procesu je odstraněn. V ideálním případě se to všechno děje v mrknutí oka a procesy v zombie státu neexistují velmi dlouho.
PŘÍBUZNÝ: Jak spustit a ovládat procesy pozadí na Linuxu
Co způsobuje procesy zombie na Linuxu?
Špatně písemný mateřský proces nemusí volat
Počkejte()
funkce při vytváření procesu dítěte. To znamená, že nic není sledováním změn stavu v dětském procesu a
Sigchld.
Signál bude ignorován. Nebo snad další aplikace ovlivňuje provádění rodičovského procesu, a to buď v důsledku špatného programování nebo škodlivého záměru.
Pokud se však rodičovský proces nesleduje změny stavu v podřízeném procesu, náleží správný systém úklidu. PCB a položka v tabulce procesu nebudou odstraněny, když se podřízený proces ukončí. Výsledkem je zombie stát nikdy odstraněn z PCB.
Zombie používají trochu paměti, ale obvykle nepředstavují problém. Záznam v tabulce procesu je malý, ale dokud není vydán, ID procesu nelze znovu použít. Na 64bitovém operačním systému, to je nepravděpodobné, že by způsobilo jakékoli problémy, protože PCB je mnohem větší než položka tabulky procesu.
Obrovské množství zombie by mohlo být možné, ovlivnit množství paměti, která je zdarma pro jiné procesy. Pokud máte mnoho zombie, máte vážný problém s nadřazenou aplikací nebo chybou operačního systému.
Jak odstranit procesy zombie
Nemůžete zabít proces zombie, protože je už mrtvý. Nebude reagovat na žádné signály, protože je odstraněno z paměti - není nikde k odeslání
Sigkill.
signál. Můžete vyzkoušet odeslání
Sigchld.
Signál do rodičovského procesu, ale pokud to nefungovalo, když se dítě ukončil, je nepravděpodobné, že by to fungovalo.
Jediným spolehlivým řešením je zabít mateřský proces. Když je ukončeno, jeho podřízené procesy jsou zděděny
init
Proces, který je prvním procesem spuštění v systému Linux (jeho ID procesu je 1).
. \ T
init
Proces pravidelně provádí potřebné vyčištění zombie, takže je zabít, prostě musíte zabít proces, který je vytvořil. . \ T
horní
Příkaz je pohodlný způsob, jak zjistit, zda máte nějaké zombie.
Zadejte následující:
Top
Tento systém má osm zombie procesů. My
Může seznamovat
pomocí
ps.
příkaz
a potrubí
egrep.
. Zombie procesy mají opět státní vlajka "Z," a obvykle uvidíte také "Defunct".
Zadejte následující:
PS AUX | EGREP "z | Z | Z | Defunct"
Procesy zombie jsou uvedeny.
Jedná se o místo, jak objevit ID procesu zombie než rolování tam a zpět
horní
. Vidíme také, že aplikace s názvem "Badprg" tyto zombie plodila.
Procesní ID prvního zombie je 7641, ale musíme najít ID procesu jeho rodičovství. Můžeme tak učinit pomocí
znovu. Budeme používat možnost výstupu (
ps.
-Ó
) říct
ps.
Chcete-li zobrazit pouze ID procesu rodiče a pak jej předejte
PPID =
vlajka.
Proces, který chceme najít, bude indikován pomocí
-p.
(Process) a pak projíždění ID procesu Zombie.
Z tohoto důvodu zadáváme následující příkaz k vyhledání informací o procesu pro proces 7641, ale oznámí pouze ID rodičovského procesu:
PS -O PPID = -P 7641
Řekli jsme, že ID mateřského procesu je 7636. Můžeme to nyní křížové odkazy pomocí
ps.
ještě jednou.
Vidíme to odpovídá názvu nadřazeného procesu z dřívějška. Zabít nadřazený proces, použijte volbu SIGKILL s příkazem kill takto:
zabít -SIGKILL 7636
V závislosti na vlastníkovi nadřazeného procesu, budete možná muset použít
sudo
.
Zombies Nejsou Scary ...
... pokud jsou v masivní horda. Několik nejsou čeho bát a jednoduchým restartu bude vyhladit.
Nicméně, pokud si všimnete, že aplikace nebo proces je vždy plodit zombie, to je něco, co byste se měli podívat do. Je to s největší pravděpodobností jen nedbale napsaný program v tom případě, možná tam je aktualizovaná verze, která řádně uklidí po jeho podřízených procesů.