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.
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}')