Noć vještica na Linuxu: kako ubiti zombi procese

halloween marka

Dan mrtvih dolazi i zato želimo napraviti ovaj mali tutorial od LxA da razgovaramo o zombi procesi i kako ih možemo ubiti. Prvo što treba reći je što je zombi proces, a to je da kao što znate, Linux kernel ima podsustav za upravljanje procesima i radi s planerom za stvaranje, promjenu prioriteta, slanje ili uklanjanje toka obrade CPU-a i ubiti procese. Pa, ovaj dio jezgre, poput ostalog sistema sličnog Unixu, razlikuje različita stanja procesa ...

Tako da to možemo pronaći proces može biti u stanju spavanja (S), odnosno u snu. Takođe procesi u aktivnom stanju (R) koji su oni koji se trenutno izvode ili izvode, procesi koji čekaju (D) koji su zaustavljeni čekajući da im se prisustvuje, gestikuliraju (T) ili obustave, a takođe i zombiji (Z) ili umrli. Zombi ili mrtvi proces je onaj koji je već uspješno okončan, ali je otet određenim sistemskim resursima jer ga Linux još uvijek sprema u tablicu procesa. Već znate da kad proces završi, on ne bi trebao ostati u ovom stanju, već se dovršava i kernel oslobađa resurse tako da ih drugi procesi mogu koristiti, u osnovi oslobađa zauzetu RAM memoriju

Pa, budući da nije zanimljivo imati ovu vrstu zombi procesa, iako oni nisu toliko česti, možemo ih tražiti i eliminirati kako je ovdje naznačeno. Prva stvar je utvrditi postoje li zombi procesi u našoj distribuciji i za to si možemo pomoći alati poput vrha ili poput ps. Na primjer, jedna od ove dvije mogućnosti:

ps -el | grep 'Z'

ps aux | grep defunct

A jednom otkriveni možemo ubij ga direktno sa:

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

Iako je druga alternativa pronalaženje nadređenih procesa, od do ubiti zombi proces Morate ubiti roditeljske procese koji ga održavaju, kao što ste možda zaključili:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Morat ćete zamijeniti prema ID zombi procesu koji ste pronašli i da biste ga ubili kill, koristite ID nadređenog procesa koji zamjenjuje u primjeru, očito.


Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Odgovoran za podatke: AB Internet Networks 2008 SL
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   pravili lopte rekao je

    Dobra stranica!
    Uvek nas izvuku iz nevolje.

    Gdje kaže:
    Iako je druga alternativa pronaći roditeljske procese, jer da biste ubili zombi proces morate ubiti roditeljske procese koji ga podržavaju, kao što ste možda zaključili:

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

    Morat ćete zamijeniti ID zombi procesa koji ste pronašli i da biste ga ubili sa kill, koristite ID roditeljskog procesa zamjenom u primjeru, očigledno.

    možete dodati skriptu:

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

    Naravno, to nije zadatak koji običan korisnik obavlja stalno.
    Bilo bi korisno samo za administratora, ali je opasno pokrenuti ga kao root, jer može ubiti bilo koji proces na sistemu.

    U man kill ima ovu notu:

    NAPOMENE Vaša ljuska (interpretator komandne linije) može imati ugrađenu naredbu za uklanjanje. Možete
    potrebno je pokrenuti naredbu opisanu ovdje kao / bin / kill da biste riješili konflikt.

    Bash ima tu komandu, ovo je dio man bash o tome:

    ubiti [-s sigspec | -n signum | -sigspec] [pid | jobspec] ...
    ubiti -l | -L [sigspec | izlaz_status]
    Pošaljite signal nazvan po sigspec ili signum procesima imenovanim po pid ili posao
    spec. sigspec je ili ime signala bez obzira na velika i mala slova kao što je SIGKILL (sa ili
    bez prefiksa SIG) ili signalnog broja; signum je signalni broj. Ako
    sigspec nije prisutan, onda se pretpostavlja SIGTERM. Argument -l navodi
    imena signala. Ako se daju bilo koji argumenti kada je dat -l, imena
    signali koji odgovaraju argumentima su navedeni, a status povratka je 0.
    Argument exit_status za -l je broj koji specificira ili broj signala ili
    izlazni status procesa koji je prekinut signalom. -L opcija je ekvivalentna
    posuđen -l. kill vraća true ako je barem jedan signal uspješno poslan, ili
    false ako dođe do greške ili se naiđe na nevažeću opciju.

    Na početku objašnjavaju kako bash štiti procese, da bi izbjegli neke probleme, ali nije mi jasno kako da napravim sigurnu skriptu za pokretanje kao root.
    Jedino čega mogu da smislim je da ga zaštitim ovako:

    $cat killppid.sh
    #! / bin / bash
    ako [$ USER == "root"]
    onda echo Ne pokreni $0 kao root !!! opasno je!
    izlaz
    fi

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

    $

    Koristite bash kill, a ne / bin / kill

    Kako vidite da nisam baš dobro upućen u bash.
    Znate li kako napisati sigurnu skriptu koja se pokreće kao korisnik podređenog procesa, čak i ako se pokreće kao root?
    nešto ekvivalentno onome što bi se uradilo ručno ovako:

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