Dødens dag kommer, og det er derfor, vi vil lave denne lille tutorial fra LxA for at tale om zombie processer og hvordan vi kan dræbe dem. Den første ting at sige er, hvad zombie-processen er, og det er, at som du ved, har Linux-kernen et undersystem til at styre processerne og arbejder med planlæggeren for at oprette, variere prioriteten, sende eller fjerne CPU-behandlingsflowet og dræbe processer. Denne del af kernen skelner ligesom resten af Unix-lignende systemer mellem forskellige tilstande af processer ...
Så vi kan finde det et forløb det kan være i sovende (S) tilstand, dvs. sovende. Også processer i kørende tilstand (R), som er dem, der kører eller kører i øjeblikket, processer, der venter (D), der stoppes med at vente på at blive deltaget, gestpt (T) eller suspenderet, og også zombierne (Z) eller afdøde. En zombie eller død proces er en proces, der allerede er afsluttet med succes, men der er kapret visse systemressourcer, da Linux stadig gemmer den i procestabellen. Du ved allerede, at når en proces slutter, skal den ikke forblive i denne tilstand, men snarere færdiggør den, og kernen frigør ressourcerne, så andre processer kan bruge dem, dybest set frigør den besatte RAM ...
Da det ikke er interessant at have denne type zombieprocesser, selvom de ikke er så hyppige, kan vi søge efter og eliminere dem som angivet her. Den første ting er at finde ud af, om der er zombieprocesser i vores distro, og til det kan vi hjælpe os selv værktøjer som top eller som ps. For eksempel en af disse to muligheder:
ps -el | grep 'Z' ps aux | grep defunct
Og når det er opdaget, kan vi Dræb ham direkte med:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
Selvom et andet alternativ er at finde de overordnede processer, siden til dræb en zombie proces Du er nødt til at dræbe de forældreprocesser, der opretholder det, som du måske har udledt:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
Du bliver nødt til at erstatte ved id'et for den zombieproces, du har fundet, og for at dræbe den med dræb, skal du bruge id'et til den overordnede proces, der erstattes i eksemplet tydeligvis.
Godt sted!
De får os altid ud af problemer.
Hvor siger:
Selvom et andet alternativ er at finde forældreprocesserne, da for at dræbe en zombieproces skal du dræbe de forældreprocesser, der understøtter den, som du måske har udledt:
1 | ps -eo pid, ppid | grep
2|
3 | dræbe -9
Du bliver nødt til at erstatte ID'et for den zombieproces, som du har fundet, og for at dræbe den med kill, skal du naturligvis bruge ID'et for den overordnede proces, der erstatter i eksemplet.
du kan tilføje scriptet:
$ kat killppid.sh
#! / Bin / bash
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
Det er selvfølgelig ikke en opgave, som en normal bruger udfører hele tiden.
Det ville kun være nyttigt for administratoren, men det er farligt at køre det som root, fordi det kan dræbe enhver proces på systemet.
I man kill har den denne note:
BEMÆRKNINGER Din shell (kommandolinjefortolker) kan have en indbygget kill-kommando. Du kan
nødt til at køre kommandoen beskrevet her som / bin / kill for at løse konflikten.
Bash har den kommando, dette er den del af man bash om det:
dræbe [-s sigspec | -n signum | -sigspec] [pid | jobspec]...
dræbe -l | -L [sigspec | exit_status]
Send signalet navngivet af sigspec eller signum til processerne navngivet efter pid eller job
spec. sigspec er enten et signalnavn, der skelner mellem store og små bogstaver, såsom SIGKILL (med eller
uden SIG-præfikset) eller et signalnummer; signum er et signalnummer. Hvis
sigspec er ikke til stede, så antages SIGTERM. Et argument på -l viser
signalnavne. Hvis nogen argumenter er angivet, når -l er givet, navnene på
signaler, der svarer til argumenterne, vises, og returstatus er 0.
Argumentet exit_status til -l er et tal, der angiver enten et signalnummer eller
udgangsstatus for en proces afsluttet af et signal. Valgmuligheden -L er tilsvarende
udlånt til -l. kill returnerer sandt, hvis mindst ét signal blev sendt, eller
falsk, hvis der opstår en fejl, eller hvis der opstår en ugyldig indstilling.
I begyndelsen forklarer de, hvordan bash beskytter processerne, for at undgå nogle problemer, men det er ikke klart for mig, hvordan jeg kunne få et sikkert script til at køre som root.
Det eneste jeg kan komme i tanke om er at beskytte det sådan her:
$ kat killppid.sh
#! / Bin / bash
hvis [$ BRUGER == "rod"]
derefter echo Kør ikke $ 0 som root !!! det er farligt!
frakørsel
fi
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
$
Brug bash's kill, ikke / bin / kill
Hvordan kan du se, at jeg ikke er særlig velbevandret i bash.
Ved du, hvordan man skriver et sikkert script, der kører som brugeren af den underordnede proces, selvom det kører som root?
noget svarende til hvad der ville blive gjort manuelt som dette:
$ su;
$ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')