Halloween pe Linux: cum să ucizi procesele zombie

timbru de Halloween

Ziua morților vine și de aceea vrem să facem acest mic tutorial de la LxA pentru a vorbi despre procese zombie și cum îi putem ucide. Primul lucru de spus este care este procesul zombie, și anume că, după cum știți, nucleul Linux are un subsistem pentru a gestiona procesele și funcționează cu programatorul pentru a crea, varia prioritatea, trimite sau elimina fluxul de procesare CPU și ucide procesele. Ei bine, această parte a nucleului, ca și restul sistemelor de tip Unix, face distincție între diferite stări de procese ...

Deci putem găsi asta un proces poate fi în stare de somn (S), adică adormit. De asemenea, procesele într-o stare de rulare (R) care sunt cele care rulează sau rulează în prezent, procesele de așteptare (D) care sunt oprite în așteptarea participării, gestpt (T) sau suspendate, precum și zombii (Z) sau decedați. Un proces zombie sau mort este unul care a fost deja încheiat cu succes, dar are anumite resurse de sistem deturnate, deoarece Linux îl salvează încă în tabelul de procese. Știți deja că, atunci când un proces se termină, acesta nu ar trebui să rămână în această stare, ci se finalizează și nucleul eliberează resursele, astfel încât alte procese să le poată folosi, practic eliberează memoria RAM ocupată ...

Ei bine, deoarece nu este interesant să avem acest tip de procese zombie, deși nu sunt la fel de frecvente, le putem căuta și elimina așa cum este indicat aici. Primul lucru este să aflăm dacă există procese zombie în distribuția noastră și pentru asta ne putem ajuta instrumente precum top sau ca ps. De exemplu, una dintre aceste două opțiuni:

ps -el | grep 'Z'

ps aux | grep defunct

Și odată detectat, putem omoara-l direct cu:

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

Deși o altă alternativă este de a găsi procesele părinte, de la ucide un proces zombie Trebuie să ucizi procesele părinte care îl susțin, după cum probabil ai dedus:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Va trebui să înlocuiți după ID-ul procesului zombie pe care l-ați găsit și pentru a-l ucide cu kill, utilizați ID-ul procesului părinte înlocuind în exemplu, evident.


Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: AB Internet Networks 2008 SL
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   făcut mingi el a spus

    Site bun!
    Ne scot mereu din necaz.

    Unde spune:
    Deși o altă alternativă este să găsești procesele părinte, deoarece pentru a ucide un proces zombie trebuie să omorâți procesele părinte care îl susțin, după cum probabil ați dedus:

    1 | ps -eo pid, pid | grep
    2|
    3 | ucide -9

    Va trebui să înlocuiți ID-ul procesului zombie pe care l-ați găsit și să-l ucideți cu kill, utilizați ID-ul procesului părinte substituind în exemplu, evident.

    poti adauga scriptul:

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

    Desigur, nu este o sarcină pe care un utilizator normal o îndeplinește tot timpul.
    Ar fi util doar pentru administrator, dar este periculos să îl rulați ca root, deoarece poate distruge orice proces din sistem.

    În om kill are această notă:

    NOTE Shell-ul dumneavoastră (interpretul de linie de comandă) poate avea o comandă kill încorporată. Poți
    trebuie să rulați comanda descrisă aici ca / ​​bin / kill pentru a rezolva conflictul.

    Bash are această comandă, aceasta este partea lui man bash despre asta:

    ucide [-s sigspec | -n signum | -sigspec] [pid | specificație de muncă]...
    ucide -l | -L [sigspec | exit_status]
    Trimiteți semnalul numit de sigspec sau signum către procesele denumite de pid sau job
    spec. sigspec este fie un nume de semnal fără majuscule, cum ar fi SIGKILL (cu sau
    fără prefixul SIG) sau un număr de semnal; signum este un număr semnal. Dacă
    sigspec nu este prezent, atunci se presupune SIGTERM. Un argument de -l listează
    nume de semnal. Dacă sunt furnizate argumente când este dat -l, numele lui
    sunt listate semnalele corespunzătoare argumentelor, iar starea de returnare este 0.
    Argumentul exit_status la -l este un număr care specifică fie un număr de semnal, fie
    starea de ieșire a unui proces încheiat cu un semnal. Opțiunea -L este echivalentă
    împrumutat lui -l. kill returnează adevărat dacă cel puțin un semnal a fost trimis cu succes, sau
    false dacă apare o eroare sau este întâlnită o opțiune nevalidă.

    La început ei explică modul în care bash protejează procesele, pentru a evita unele probleme, dar nu îmi este clar cum aș putea face un script sigur să ruleze ca root.
    Singurul lucru la care mă pot gândi este să-l protejez astfel:

    $cat killppid.sh
    #! / Bin / bash
    dacă [$ USER == „rădăcină”]
    apoi echo Nu rulați $ 0 ca root !!! e periculos!
    ieşire
    fi

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

    $

    Folosește bash's kill, nu / bin / kill

    Cum vezi că nu sunt foarte bine versat în bash.
    Știți cum să scrieți un script securizat care rulează ca utilizator al procesului copil, chiar dacă rulează ca root?
    ceva echivalent cu ceea ce ar fi făcut manual, astfel:

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