Ziua morților vine și de aceea vrem să facem acest mic tutorial de la LxA pentru a vorbi despre procese zombie și cum îi putem ucide. Primul lucru de spus este care este procesul zombie, și anume că, după cum știți, nucleul Linux are un subsistem pentru a gestiona procesele și funcționează cu programatorul pentru a crea, varia prioritatea, trimite sau elimina fluxul de procesare CPU și ucide procesele. Ei bine, această parte a nucleului, ca și restul sistemelor de tip Unix, face distincție între diferite stări de procese ...
Deci putem găsi asta un proces poate fi în stare de somn (S), adică adormit. De asemenea, procesele într-o stare de rulare (R) care sunt cele care rulează sau rulează în prezent, procesele de așteptare (D) care sunt oprite în așteptarea participării, gestpt (T) sau suspendate, precum și zombii (Z) sau decedați. Un proces zombie sau mort este unul care a fost deja încheiat cu succes, dar are anumite resurse de sistem deturnate, deoarece Linux îl salvează încă în tabelul de procese. Știți deja că, atunci când un proces se termină, acesta nu ar trebui să rămână în această stare, ci se finalizează și nucleul eliberează resursele, astfel încât alte procese să le poată folosi, practic eliberează memoria RAM ocupată ...
Ei bine, deoarece nu este interesant să avem acest tip de procese zombie, deși nu sunt la fel de frecvente, le putem căuta și elimina așa cum este indicat aici. Primul lucru este să aflăm dacă există procese zombie în distribuția noastră și pentru asta ne putem ajuta instrumente precum top sau ca ps. De exemplu, una dintre aceste două opțiuni:
ps -el | grep 'Z' ps aux | grep defunct
Și odată detectat, putem omoara-l direct cu:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
Deși o altă alternativă este de a găsi procesele părinte, de la ucide un proces zombie Trebuie să ucizi procesele părinte care îl susțin, după cum probabil ai dedus:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
Va trebui să înlocuiți după ID-ul procesului zombie pe care l-ați găsit și pentru a-l ucide cu kill, utilizați ID-ul procesului părinte înlocuind în exemplu, evident.
Site bun!
Ne scot mereu din necaz.
Unde spune:
Deși o altă alternativă este să găsești procesele părinte, deoarece pentru a ucide un proces zombie trebuie să omorâți procesele părinte care îl susțin, după cum probabil ați dedus:
1 | ps -eo pid, pid | grep
2|
3 | ucide -9
Va trebui să înlocuiți ID-ul procesului zombie pe care l-ați găsit și să-l ucideți cu kill, utilizați ID-ul procesului părinte substituind în exemplu, evident.
poti adauga scriptul:
$cat killppid.sh
#! / Bin / bash
kill -9 $ (ps -eo pid, pipid | awk '$ 1 ==' $ {1} '{print $ 2}')
Desigur, nu este o sarcină pe care un utilizator normal o îndeplinește tot timpul.
Ar fi util doar pentru administrator, dar este periculos să îl rulați ca root, deoarece poate distruge orice proces din sistem.
În om kill are această notă:
NOTE Shell-ul dumneavoastră (interpretul de linie de comandă) poate avea o comandă kill încorporată. Poți
trebuie să rulați comanda descrisă aici ca / bin / kill pentru a rezolva conflictul.
Bash are această comandă, aceasta este partea lui man bash despre asta:
ucide [-s sigspec | -n signum | -sigspec] [pid | specificație de muncă]...
ucide -l | -L [sigspec | exit_status]
Trimiteți semnalul numit de sigspec sau signum către procesele denumite de pid sau job
spec. sigspec este fie un nume de semnal fără majuscule, cum ar fi SIGKILL (cu sau
fără prefixul SIG) sau un număr de semnal; signum este un număr semnal. Dacă
sigspec nu este prezent, atunci se presupune SIGTERM. Un argument de -l listează
nume de semnal. Dacă sunt furnizate argumente când este dat -l, numele lui
sunt listate semnalele corespunzătoare argumentelor, iar starea de returnare este 0.
Argumentul exit_status la -l este un număr care specifică fie un număr de semnal, fie
starea de ieșire a unui proces încheiat cu un semnal. Opțiunea -L este echivalentă
împrumutat lui -l. kill returnează adevărat dacă cel puțin un semnal a fost trimis cu succes, sau
false dacă apare o eroare sau este întâlnită o opțiune nevalidă.
La început ei explică modul în care bash protejează procesele, pentru a evita unele probleme, dar nu îmi este clar cum aș putea face un script sigur să ruleze ca root.
Singurul lucru la care mă pot gândi este să-l protejez astfel:
$cat killppid.sh
#! / Bin / bash
dacă [$ USER == „rădăcină”]
apoi echo Nu rulați $ 0 ca root !!! e periculos!
ieşire
fi
kill -9 $ (ps -eo pid, pipid | awk '$ 1 ==' $ {1} '{print $ 2}')
$
Folosește bash's kill, nu / bin / kill
Cum vezi că nu sunt foarte bine versat în bash.
Știți cum să scrieți un script securizat care rulează ca utilizator al procesului copil, chiar dacă rulează ca root?
ceva echivalent cu ceea ce ar fi făcut manual, astfel:
$ su;
$ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')