Noč čarovnic v Linuxu: kako ubiti zombi procese

noč čarovnic

Prihaja dan mrtvih in zato želimo narediti to majhno vadnico LxA, da se pogovorimo o zombi procesi in kako jih lahko ubijemo. Najprej je treba povedati, kaj je zombi proces, in sicer je, da ima jedro Linuxa, kot veste, podsistem za upravljanje procesov in sodeluje z razporejevalnikom za ustvarjanje, spreminjanje prioritete, pošiljanje ali odstranjevanje toka obdelave CPU in ubijanje procesov. No, tudi ta del jedra, tako kot ostali Unixu podobni sistemi, razlikuje med različnimi stanji procesov ...

Torej to lahko najdemo proces lahko je v stanju spanja (S), torej v spanju. Tudi procesi v delujočem stanju (R), ki so tisti, ki se trenutno izvajajo ali izvajajo, procesi, ki čakajo (D), ki nehajo čakati na udeležbo, gestpt (T) ali začasno ustavitev, in tudi zombi (Z) ali umrli. Zombi ali mrtev postopek je tisti, ki je bil že uspešno zaključen, vendar ima določene sistemske vire ugrabljene, saj jih Linux še vedno shranjuje v tabelo procesov. Že veste, da ko se postopek konča, ne bi smel ostati v tem stanju, temveč se dokonča in jedro sprosti vire, da jih lahko uporabijo drugi procesi, v bistvu osvobodi zasedeni RAM ...

No, ker ni zanimivo imeti tovrstnih zombi procesov, čeprav niso tako pogosti, jih lahko poiščemo in odpravimo, kot je navedeno tukaj. Prva stvar je ugotoviti, ali v naši distribuciji obstajajo zombi procesi in si za to lahko pomagamo sami orodja, kot so vrh ali kot ps. Na primer ena od teh dveh možnosti:

ps -el | grep 'Z'

ps aux | grep defunct

In ko smo enkrat zaznani, lahko Ubij ga neposredno z:

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

Čeprav je druga možnost poiskati nadrejene procese, od do ubiti postopek zombija Kot ste morda sklepali, morate ubiti nadrejene procese, ki ga vzdržujejo:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Nadomestiti boste morali z ID-jem zombi procesa, ki ste ga našli, in če ga želite ubiti z kill, uporabite ID nadrejenega procesa, ki nadomešča v primeru očitno.


Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Odgovoren za podatke: AB Internet Networks 2008 SL
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.

  1.   narejene kroglice je dejal

    Dobra stran!
    Vedno nas rešijo iz težav.

    Kje pravi:
    Čeprav je druga alternativa iskanje nadrejenih procesov, saj morate za uničenje zombijevega procesa ubiti nadrejene procese, ki ga podpirajo, kot ste morda ugotovili:

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

    Zamenjati boste morali ID zombi procesa, ki ste ga našli, in da ga ubijete z ubijanjem, očitno uporabite ID nadrejenega procesa, ki ga zamenjate v primeru.

    lahko dodate skript:

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

    Seveda ne gre za nalogo, ki jo normalen uporabnik opravlja ves čas.
    Koristno bi bilo samo za skrbnika, vendar je nevarno, če ga zaženete kot root, ker lahko ubije kateri koli proces v sistemu.

    V man kill ima to noto:

    OPOMBE Vaša lupina (tolmač ukazne vrstice) ima morda vgrajen ukaz za uničenje. Ti lahko
    morate zagnati ukaz, opisan tukaj kot / bin / kill, da rešite konflikt.

    Bash ima ta ukaz, to je del man bash o tem:

    ubiti [-s sigspec | -n znak | -sigspec] [pid | delovno mesto] ...
    ubiti -l | -L [sigspec | izhodni_status]
    Pošljite signal, imenovan s sigspec ali signum, procesom, imenovanim s pid ali job
    spec. sigspec je bodisi ime signala, ki ne razlikuje velikih in malih črk, kot je SIGKILL (z ali
    brez predpone SIG) ali signalne številke; signum je signalna številka. Če
    sigspec ni prisoten, potem se predpostavlja SIGTERM. Argument -l navaja
    imena signalov. Če so podani kateri koli argumenti, ko je podan -l, imena elementov
    signali, ki ustrezajo argumentom, so navedeni, povratni status pa je 0.
    Argument exit_status za -l je število, ki določa bodisi številko signala ali
    izhodni status procesa, končanega s signalom. Možnost -L je enakovredna
    posojen na -l. kill vrne true, če je bil vsaj en signal uspešno poslan oz
    false, če pride do napake ali naleti na neveljavno možnost.

    Na začetku pojasnjujejo, kako bash ščiti procese, da se izogne ​​nekaterim težavam, vendar mi ni jasno, kako bi lahko naredil varen skript, ki bi se izvajal kot root.
    Edina stvar, ki si jo lahko zamislim, je, da jo zaščitim takole:

    $cat killppid.sh
    #! / Bin / bash
    če [$ USER == "root"]
    potem echo Ne zaženite $ 0 kot root !!! nevarno je!
    izhod
    fi

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

    $

    Uporabite bash's kill, ne / bin / kill

    Kako vidiš, da nisem dobro podkovan v bash.
    Ali veste, kako napisati varen skript, ki se izvaja kot uporabnik podrejenega procesa, tudi če se izvaja kot root?
    nekaj enakovrednega temu, kar bi bilo ročno narejeno takole:

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