Halloween v systéme Linux: ako zabíjať procesy zombie

halloweenska pečiatka

Deň mŕtvych sa blíži a preto chceme urobiť tento malý tutoriál od LxA, aby sme hovorili o zombie procesy a ako ich môžeme zabiť. Prvá vec, ktorú treba povedať, je proces zombie, a to je, ako viete, linuxové jadro má podsystém na správu procesov a pracuje s plánovačom na vytváraní, obmieňaní priorít, odosielaní alebo odstraňovaní toku CPU a zabiť procesy. Táto časť jadra, rovnako ako ostatné systémy podobné systému Unix, rozlišuje medzi rôznymi stavmi procesov ...

Takže to môžeme nájsť proces môže to byť v stave spánku (S), to znamená, že spí. Tiež procesy v bežiacom stave (R), ktoré sú momentálne spustené alebo bežia, procesy čakajúce (D), ktoré sú zastavené čakaním na účasť, gestom (T) alebo pozastaveným, a tiež zombie (Z) alebo zosnulé. Zombie alebo mŕtvy proces je proces, ktorý už bol úspešne ukončený, ale došlo k únosu určitých systémových zdrojov, pretože systém Linux ho stále ukladá do tabuľky procesov. Už viete, že keď proces skončí, nemal by zostať v tomto stave, ale je dokončený a jadro uvoľní zdroje, aby ich mohli použiť iné procesy, v podstate uvoľní obsadenú RAM ...

Pretože nie je zaujímavé mať tento typ zombie procesov, aj keď nie sú také časté, môžeme ich vyhľadať a eliminovať, ako je tu uvedené. Prvá vec je zistiť, či v našom distre existujú procesy zombie, a preto si môžeme pomôcť sami nástroje ako top alebo ako ps. Napríklad jedna z týchto dvoch možností:

ps -el | grep 'Z'

ps aux | grep defunct

Akonáhle to zistíme, môžeme zabiť ho priamo s:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Aj keď ďalšou alternatívou je nájsť nadradené procesy, keďže zabiť zombie proces Musíte zabiť rodičovské procesy, ktoré ho udržiavajú, ako ste si mohli odvodiť:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Budete musieť vymeniť podľa ID zombie procesu, ktorý ste našli a na zabitie pomocou kill, použite ID nadradeného procesu ako náhradu v príklade samozrejme.


Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Za údaje zodpovedá: AB Internet Networks 2008 SL
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.

  1.   vyrobené gule dijo

    Dobrá stránka!
    Vždy nás dostanú z problémov.

    Kde hovorí:
    Aj keď ďalšou alternatívou je nájsť rodičovské procesy, keďže na zabitie zombie procesu musíte zabiť rodičovské procesy, ktoré ho podporujú, ako ste možno usúdili:

    1 | ps -eo pid, ppid | grep
    2|
    3 | zabiť -9

    Budete musieť nahradiť ID procesu zombie, ktorý ste našli, a zabiť ho pomocou kill, samozrejme použite ID rodičovského procesu, ktorý nahrádza v príklade.

    môžete pridať skript:

    $cat killppid.sh
    #! / Bin / bash
    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Samozrejme, nie je to úloha, ktorú bežný používateľ vykonáva neustále.
    Bolo by to užitočné len pre administrátora, ale spúšťať ho ako root je nebezpečné, pretože môže zabiť akýkoľvek proces v systéme.

    V man kill to má túto poznámku:

    POZNÁMKY Váš shell (prekladač príkazového riadku) môže mať zabudovaný príkaz kill. Môžeš
    na vyriešenie konfliktu je potrebné spustiť príkaz popísaný tu ako / bin / kill.

    Bash má tento príkaz, toto je časť man bash o tom:

    zabiť [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
    zabiť -l | -L [sigspec | exit_status]
    Pošlite signál s názvom sigspec alebo signum procesom pomenovaným podľa pid alebo job
    špec. sigspec je buď názov signálu nerozlišujúci veľké a malé písmená, ako napríklad SIGKILL (s alebo
    bez prefixu SIG) alebo čísla signálu; signum je číslo signálu. Ak
    sigspec nie je prítomný, potom sa predpokladá SIGTERM. Argument -l uvádza
    názvy signálov. Ak sú pri zadaní -l zadané nejaké argumenty, názvy prvkov
    sú uvedené signály zodpovedajúce argumentom a návratový stav je 0.
    Argument exit_status pre -l je číslo špecifikujúce buď číslo signálu alebo
    stav ukončenia procesu ukončeného signálom. Možnosť -L je ekvivalentná
    požičal na -l. kill vráti hodnotu true, ak bol úspešne odoslaný aspoň jeden signál, príp
    false, ak sa vyskytne chyba alebo sa vyskytne neplatná možnosť.

    Na začiatku vysvetľujú, ako bash chráni procesy, aby sa predišlo niektorým problémom, ale nie je mi jasné, ako by som mohol vytvoriť bezpečný skript, ktorý sa spustí ako root.
    Jediné, čo ma napadá, je chrániť to takto:

    $cat killppid.sh
    #! / Bin / bash
    ak [$ USER == "root"]
    potom echo Nespúšťajte $ 0 ako root !!! je to nebezpečné!
    výjazd
    fi

    kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Použite bash's kill, nie / bin / kill

    Ako vidíš, že sa v bash veľmi nevyznám.
    Viete, ako napísať bezpečný skript, ktorý sa spustí ako používateľ podriadeného procesu, aj keď je spustený ako root?
    niečo ekvivalentné tomu, čo by sa urobilo ručne, ako je toto:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')