Halloween në Linux: si të vrasësh proceset e zombies

pulla e Halloween

Dita e të vdekurve po vjen dhe kjo është arsyeja pse ne duam ta bëjmë këtë udhëzues të vogël nga LxA për të folur rreth proceset e zombies dhe si mund t'i vrasim ata. Gjëja e parë për të thënë është se cili është procesi i zombies, dhe kjo është se siç e dini, kerneli Linux ka një nënsistem për të menaxhuar proceset dhe punon me planifikuesin për të krijuar, ndryshuar përparësinë, dërguar ose hequr rrjedhën e përpunimit të CPU dhe vrasin proceset. Epo, kjo pjesë e bërthamës, si pjesa tjetër e sistemeve të ngjashme me Unix, bën dallimin midis gjendjeve të ndryshme të proceseve ...

Kështu që ne mund ta gjejmë atë një proces mund të jetë në gjendje gjumi (S), domethënë në gjumë. Gjithashtu proceset në një gjendje drejtuese (R) të cilat janë ato që aktualisht janë duke ekzekutuar ose ekzekutuar, proceset në pritje (D) që ndalen duke pritur për t'u ndjekur, gestpt (T) ose pezulluar, dhe gjithashtu zombies (Z) ose të vdekur. Një proces i zombies ose i vdekur është ai që tashmë është përfunduar me sukses, por ka burime të caktuara të sistemit të rrëmbyera pasi Linux ende po e ruan atë në tabelën e procesit. Ju tashmë e dini që kur një proces mbaron, ai nuk duhet të qëndrojë në këtë gjendje, por përfundon dhe kerneli liron burimet në mënyrë që proceset e tjera t'i përdorin ato, në thelb ajo çliron RAM-in e zënë ...

Epo, pasi nuk është interesante të kesh këtë lloj procesi zombie, edhe pse nuk janë aq të shpeshta, ne mund t'i kërkojmë dhe t'i eleminojmë ato siç tregohet këtu. Gjëja e parë është të zbulojmë nëse ka procese zombie në distro tonë dhe për këtë ne mund të ndihmojmë vetveten mjete si top ose si ps. Për shembull, një nga këto dy opsione:

ps -el | grep 'Z'

ps aux | grep defunct

Dhe pasi zbulohet, ne mundemi vrite ate direkt me:

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

Megjithëse një alternativë tjetër është gjetja e proceseve prindërore, që nga vrasin një proces zombie Ju duhet të vrisni proceset prindërore që e mbështesin atë, siç mund të keni nxjerrë:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Ju do të duhet të zëvendësoni nga ID-ja e procesit të zombies që keni gjetur dhe për ta vrarë atë me vrasje, përdorni ID-në e procesit prind duke zëvendësuar në shembull, padyshim.


Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: AB Internet Networks 2008 SL
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.

  1.   bërë topa dijo

    Faqe e mirë!
    Na nxjerrin gjithmonë nga telashet.

    Ku thotë:
    Megjithëse një alternativë tjetër është gjetja e proceseve mëmë, pasi për të vrarë një proces zombie duhet të vrisni proceset prind që e mbështesin atë, siç mund të keni konkluduar:

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

    Ju do të duhet të zëvendësoni ID-në e procesit të zombies që keni gjetur dhe për ta vrarë atë me kill, përdorni ID-në e procesit prind që zëvendëson në shembull, padyshim.

    mund të shtoni skriptin:

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

    Sigurisht, nuk është një detyrë që një përdorues normal e kryen gjatë gjithë kohës.
    Do të ishte e dobishme vetëm për administratorin, por është e rrezikshme ta ekzekutoni atë si rrënjë, sepse mund të vrasë çdo proces në sistem.

    Tek njeriu vras ​​ka këtë shënim:

    SHËNIME Predha juaj (përkthyesi i linjës së komandës) mund të ketë një komandë të integruar vrasëse. Ti mund
    duhet të ekzekutoni komandën e përshkruar këtu si / bin / kill për të zgjidhur konfliktin.

    Bash e ka atë urdhër, kjo është pjesa e njeriut bash për të:

    vras [-s sigspec | -n shenjë | -sigspec] [pid | specifikat e punës] ...
    vras -l | -L [sigspec | status_dalje]
    Dërgoni sinjalin e emërtuar nga sigspec ose signum te proceset e emërtuara nga pid ose job
    spec. sigspec është ose një emër sinjali i pandjeshëm ndaj shkronjave të vogla si SIGKILL (me ose
    pa prefiksin SIG) ose një numër sinjali; signum është një numër sinjali. Nëse
    sigspec nuk është i pranishëm, atëherë supozohet SIGTERM. Një argument prej -l liston
    emrat e sinjaleve. Nëse jepet ndonjë argument kur jepet -l, emrat e
    renditen sinjalet që korrespondojnë me argumentet dhe statusi i kthimit është 0.
    Argumenti exit_status në -l është një numër që specifikon ose një numër sinjali ose
    statusi i daljes së një procesi të përfunduar nga një sinjal. Opsioni -L është ekuivalent
    i dha hua -l. vrasja kthehet e vërtetë nëse të paktën një sinjal është dërguar me sukses, ose
    false nëse ndodh një gabim ose haset një opsion i pavlefshëm.

    Në fillim ata shpjegojnë se si bash mbron proceset, për të shmangur disa probleme, por nuk e kam të qartë se si mund të bëj një skript të sigurt për të ekzekutuar si root.
    E vetmja gjë që mund të mendoj është ta mbroj atë si kjo:

    $cat killppid.sh
    #! / bin / bash
    nëse [$ USER == "rrënjë"]
    pastaj echo Mos e ekzekutoni $0 si rrënjë !!! është e rrezikshme!
    dalje
    fi

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

    $

    Përdorni bash's kill, jo / bin / kill

    Si e sheh qe nuk jam shume i afte ne bash.
    A e dini se si të shkruani një skript të sigurt që funksionon si përdorues i procesit fëmijë, edhe nëse funksionon si rrënjë?
    diçka ekuivalente me atë që do të bëhej manualisht si kjo:

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