Halloween v systému Linux: jak zabíjet procesy zombie

halloween razítko

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ě.


Zanechte svůj komentář

Vaše e-mailová adresa nebude zveřejněna. Povinné položky jsou označeny *

*

*

  1. Za data odpovídá: AB Internet Networks 2008 SL
  2. Účel údajů: Ovládací SPAM, správa komentářů.
  3. Legitimace: Váš souhlas
  4. Sdělování údajů: Údaje nebudou sděleny třetím osobám, s výjimkou zákonných povinností.
  5. Úložiště dat: Databáze hostovaná společností Occentus Networks (EU)
  6. Práva: Vaše údaje můžete kdykoli omezit, obnovit a odstranit.

  1.   dělal koule řekl

    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}')