Den mrtvých se blíží, a proto chceme udělat tento malý tutoriál od LxA, abychom o tom mluvili zombie procesy a jak je můžeme zabít. První věc, kterou je třeba říci, je to, co je proces zombie, a to je, jak víte, že linuxové jádro má subsystém pro správu procesů a pracuje s plánovačem na vytváření, změně priority, odesílání nebo odstraňování toku zpracování CPU a zabít procesy. Tato část jádra, stejně jako ostatní systémy podobné Unixu, rozlišuje mezi různými stavy procesů ...
Takže to můžeme najít proces může to být ve spánkovém (S) stavu, tj. spát. Také procesy v běžícím stavu (R), které jsou aktuálně spuštěné nebo běžící, procesy čekající (D), které jsou zastaveny čekáním na účast, gestem (T) nebo pozastaveny, a také zombie (Z) nebo zemřelé. Zombie nebo mrtvý proces je proces, který již byl úspěšně ukončen, ale došlo k únosu určitých systémových prostředků, protože Linux jej stále ukládá do tabulky procesů. Už víte, že když proces skončí, neměl by zůstat v tomto stavu, ale dokončí se a jádro uvolní zdroje, aby je mohly používat i jiné procesy, v podstatě uvolní obsazenou RAM ...
Protože není zajímavé mít tento typ zombie procesů, i když nejsou tak časté, můžeme je hledat a eliminovat, jak je zde uvedeno. První věcí je zjistit, zda v našem distru existují procesy zombie, a proto si můžeme pomoci sami nástroje jako top nebo jako ps. Například jedna z těchto dvou možností:
ps -el | grep 'Z' ps aux | grep defunct
A jakmile to zjistíme, můžeme Zabij ho přímo s:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
Ačkoli další alternativou je najít nadřazené procesy, protože k zabít zombie proces Musíte zabít nadřazené procesy, které ji udržují, jak jste si mohli odvodit:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
Budete muset vyměnit podle ID procesu zombie, který jste našli, a chcete-li jej zabít pomocí kill, použijte ID nadřazeného procesu jako náhradu v příkladu samozřejmě.
Dobrý web!
Vždy nás dostanou z problémů.
Kde říká:
I když další alternativou je najít rodičovské procesy, protože chcete-li zabít zombie proces, musíte zabít rodičovské procesy, které jej podporují, jak jste možná odvodili:
1 | ps -eo pid, ppid | grep
2|
3 | zabít -9
Budete muset nahradit ID procesu zombie, který jste našli, a zabít ho pomocí kill, samozřejmě použijte ID nadřazeného procesu nahrazujícího v příkladu.
můžete přidat skript:
$cat killppid.sh
#! / bin / bash
zabít -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
Samozřejmě to není úkol, který běžný uživatel provádí neustále.
Bylo by to užitečné pouze pro administrátora, ale je nebezpečné jej spouštět jako root, protože může zabít jakýkoli proces v systému.
V man kill to má tuto poznámku:
POZNÁMKY Váš shell (interpret příkazového řádku) může mít vestavěný příkaz kill. Můžeš
k vyřešení konfliktu je třeba spustit příkaz popsaný zde jako / bin / kill.
Bash má ten příkaz, toto je část man bash o tom:
zabít [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
zabít -l | -L [sigspec | exit_status]
Odešlete signál pojmenovaný pomocí sigspec nebo signum procesům pojmenovaným pomocí pid nebo job
spec. sigspec je buď název signálu nerozlišující malá a velká písmena, jako je SIGKILL (s nebo
bez prefixu SIG) nebo čísla signálu; signum je číslo signálu. Li
sigspec není přítomen, pak se předpokládá SIGTERM. Argument -l uvádí
názvy signálů. Jsou-li při zadání -l zadány nějaké argumenty, jména
jsou uvedeny signály odpovídající argumentům a návratový stav je 0.
Argument status_exit pro -l je číslo určující buď číslo signálu nebo
výstupní stav procesu ukončeného signálem. Možnost -L je ekvivalentní
půjčil -l. kill vrátí hodnotu true, pokud byl úspěšně odeslán alespoň jeden signál, nebo
false, pokud dojde k chybě nebo je zjištěna neplatná volba.
Na začátku vysvětlují, jak bash chrání procesy, aby se předešlo některým problémům, ale není mi jasné, jak bych mohl vytvořit bezpečný skript, který by běžel jako root.
Jediné, co mě napadá, je chránit to takto:
$cat killppid.sh
#! / bin / bash
if [$ USER == "root"]
potom echo Nespouštět $ 0 jako root!!! to je nebezpečné!
výstup
fi
zabít -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
$
Použijte bash's kill, ne / bin / kill
Jak vidíš, že se v bash moc nevyznám.
Víte, jak napsat bezpečný skript, který běží jako uživatel podřízeného procesu, i když běží jako root?
něco ekvivalentního tomu, co by bylo provedeno ručně takto:
$ su;
$ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')