Halloween på Linux: hvordan å drepe zombieprosesser

halloween-stempel

All Souls Day kommer, og det er derfor vi vil gjøre denne lille opplæringen fra LxA å snakke om zombie prosesser og hvordan vi kan drepe dem. Den første tingen å si er hva zombieprosessen er, og det er at Linux-kjernen som kjent har et delsystem for å administrere prosessene og jobber med planleggeren for å opprette, variere prioriteten, sende eller fjerne CPU-prosesseringsflyten og drepe prosesser. Vel, denne delen av kjernen, som andre Unix-lignende systemer, skiller mellom forskjellige tilstander av prosesser ...

Så vi kan finne det en prosess det kan være i sovende (S) tilstand, det vil si sove. Også prosesser i en kjørende tilstand (R) som er de som kjører eller kjører for tiden, prosesser som venter (D) som er stoppet og venter på å bli deltatt, gestpt (T) eller suspendert, og også zombiene (Z) eller avdøde. En zombie eller død prosess er en som allerede er avsluttet, men har visse systemressurser kapret siden Linux fremdeles lagrer den i prosesstabellen. Du vet allerede at når en prosess slutter, bør den ikke forbli i denne tilstanden, men fullfører og kjernen frigjør ressursene slik at andre prosesser kan bruke dem, i utgangspunktet frigjør den okkupert RAM ...

Vel, siden det ikke er interessant å ha denne typen zombieprosesser, selv om de ikke er så hyppige, kan vi søke etter og eliminere dem som angitt her. Det første er å finne ut om det er zombieprosesser i distroen vår, og for det kan vi hjelpe oss selv verktøy som topp eller som ps. For eksempel ett av disse to alternativene:

ps -el | grep 'Z'

ps aux | grep defunct

Og når vi først er oppdaget, kan vi Drep ham direkte med:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

Selv om et annet alternativ er å finne foreldreprosessene, siden til drep en zombieprosess Du må drepe foreldreprosessene som støtter det, som du kanskje har utledet:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Du må skifte ut etter ID for zombieprosessen du har funnet, og for å drepe den med drep, bruk IDen til den foreldreprosessen som erstattes i eksemplet, tydeligvis.


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: AB Internet Networks 2008 SL
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   laget baller sa

    Bra nettsted!
    De får oss alltid ut av problemer.

    Hvor sier:
    Selv om et annet alternativ er å finne foreldreprosessene, siden for å drepe en zombieprosess må du drepe foreldreprosessene som støtter den, som du kanskje har utledet:

    1 | ps -eo pid, ppid | grep
    2|
    3 | drepe -9

    Du må erstatte ID-en til zombieprosessen du har funnet, og for å drepe den med kill, bruk selvfølgelig ID-en til den overordnede prosessen som erstatter i eksemplet.

    du kan legge til skriptet:

    $ katt killppid.sh
    #! / Bin / bash
    drep -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    Det er selvfølgelig ikke en oppgave som en vanlig bruker utfører hele tiden.
    Det ville bare være nyttig for administratoren, men det er farlig å kjøre det som root, fordi det kan drepe enhver prosess på systemet.

    In man kill har den denne merknaden:

    MERKNADER Skallet (kommandolinjetolken) kan ha en innebygd kill-kommando. Du kan
    må kjøre kommandoen beskrevet her som / bin / kill for å løse konflikten.

    Bash har den kommandoen, dette er delen av man bash om det:

    drepe [-s sigspec | -n signum | -sigspec] [pid | jobbspesifikasjon] ...
    drep -l | -L [sigspec | exit_status]
    Send signalet navngitt av sigspec eller signum til prosessene navngitt etter pid eller jobb
    spes. sigspec er enten et signalnavn som ikke skiller mellom store og små bokstaver, for eksempel SIGKILL (med eller
    uten SIG-prefikset) eller et signalnummer; signum er et signalnummer. Hvis
    sigspec ikke er tilstede, da antas SIGTERM. Et argument på -l viser
    signalnavn. Hvis noen argumenter er gitt når -l er gitt, navnene på
    signaler som tilsvarer argumentene er oppført, og returstatusen er 0.
    Argumentet exit_status til -l er et tall som spesifiserer enten et signalnummer eller
    utgangsstatusen til en prosess avsluttet av et signal. Alternativet -L er ekvivalent
    utlånt til -l. kill returnerer true hvis minst ett signal ble sendt, eller
    usann hvis det oppstår en feil eller et ugyldig alternativ oppdages.

    Til å begynne med forklarer de hvordan bash beskytter prosessene, for å unngå noen problemer, men det er ikke klart for meg hvordan jeg kunne lage et trygt skript til å kjøre som root.
    Det eneste jeg kan tenke på er å beskytte det slik:

    $ katt killppid.sh
    #! / Bin / bash
    hvis [$ USER == "root"]
    deretter ekko Ikke kjør $0 som root!!! det er farlig!
    avslutte
    fi

    drep -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    Bruk bash's kill, ikke / bin / kill

    Hvordan kan du se at jeg ikke er så godt kjent med bash.
    Vet du hvordan du skriver et sikkert skript som kjører som brukeren av den underordnede prosessen, selv om det kjører som root?
    noe tilsvarende det som ville blitt gjort manuelt som dette:

    $ su;
    $ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')