Halloween på Linux: hvordan man dræber zombieprocesser

halloween stempel

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.


Efterlad din kommentar

Din e-mailadresse vil ikke blive offentliggjort. Obligatoriske felter er markeret med *

*

*

  1. Ansvarlig for data: AB Internet Networks 2008 SL
  2. Formålet med dataene: Control SPAM, management af kommentarer.
  3. Legitimering: Dit samtykke
  4. Kommunikation af dataene: Dataene vil ikke blive kommunikeret til tredjemand, undtagen ved juridisk forpligtelse.
  5. Datalagring: Database hostet af Occentus Networks (EU)
  6. Rettigheder: Du kan til enhver tid begrænse, gendanne og slette dine oplysninger.

  1.   lavet bolde sagde han

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