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