Halloween på Linux: hur man dödar zombieprocesser

halloween stämpel

De dödas dag kommer och det är därför vi vill göra den här lilla handledningen från LxA för att prata om zombie processer och hur vi kan döda dem. Det första man ska säga är vad zombieprocessen är, och det är att som ni vet har Linux-kärnan ett delsystem för att hantera processerna och arbetar med schemaläggaren för att skapa, variera prioriteten, skicka eller ta bort CPU-processflödet och döda processer. Tja, den här delen av kärnan, liksom resten av Unix-liknande system, skiljer mellan olika tillstånd av processer ...

Så vi kan hitta det en process det kan vara i sovande (S) tillstånd, det vill säga sovande. Även processer i ett körande tillstånd (R) som är de som för närvarande körs eller körs, processer som väntar (D) som stoppas och väntar på att delta, gestpt (T) eller avstängd, och även zombies (Z) eller avlidna. En zombie eller död process är en process som redan har avslutats framgångsrikt, men som har vissa systemresurser kapats eftersom Linux fortfarande sparar den i procestabellen. Du vet redan att när en process slutar ska den inte stanna i det här tillståndet utan slutföra och kärnan frigör resurserna så att andra processer kan använda dem, i princip frigör det upptagen RAM ...

Eftersom det inte är intressant att ha denna typ av zombieprocesser, även om de inte är så frekventa, kan vi söka efter och eliminera dem som anges här. Det första är att hitta om det finns zombieprocesser i vår distro och för det kan vi hjälpa oss själva verktyg som topp eller som ps. Till exempel ett av dessa två alternativ:

ps -el | grep 'Z'

ps aux | grep defunct

Och när vi väl upptäckt kan vi döda honom direkt med:

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

Även om ett annat alternativ är att hitta överordnade processer, sedan till döda en zombieprocess Du måste döda de föräldraprocesser som upprätthåller det, som du kanske har härledt:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

Du måste byta ut genom ID för zombieprocessen som du har hittat och för att döda den med kill, använd ID för den överordnade processen som ersätts i exemplet, uppenbarligen.


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för data: AB Internet Networks 2008 SL
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   gjort bollar sade

    Bra sida!
    De tar oss alltid ur problem.

    Var säger:
    Även om ett annat alternativ är att hitta föräldraprocesserna, eftersom för att döda en zombieprocess måste du döda de föräldraprocesser som stöder den, som du kanske har slutsats:

    1 | ps -eo pid, ppid | grep
    2|
    3 | döda -9

    Du måste ersätta ID:t för zombieprocessen som du har hittat och för att döda den med kill, använd uppenbarligen ID:t för moderprocessen som ersätter i exemplet.

    du kan lägga till skriptet:

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

    Det är naturligtvis inte en uppgift som en normal användare utför hela tiden.
    Det skulle bara vara användbart för administratören, men det är farligt att köra det som root, eftersom det kan döda alla processer på systemet.

    In man kill har den denna anteckning:

    ANMÄRKNINGAR Ditt skal (kommandoradstolk) kan ha ett inbyggt kill-kommando. Du får
    måste köra kommandot som beskrivs här som / bin / kill för att lösa konflikten.

    Bash har det kommandot, det här är delen av man bash om det:

    döda [-s sigspec | -n signum | -sigspec] [pid | jobbspec]...
    döda -l | -L [sigspec | exit_status]
    Skicka signalen namngiven av sigspec eller signum till processerna namngivna av pid eller jobb
    spec. sigspec är antingen ett skiftlägesokänsligt signalnamn som SIGKILL (med eller
    utan SIG-prefix) eller ett signalnummer; signum är ett signalnummer. Om
    sigspec inte finns, då antas SIGTERM. Ett argument av -l listar
    signalnamn. Om några argument tillhandahålls när -l ges, namnen på
    signaler som motsvarar argumenten listas och returstatusen är 0.
    Argumentet exit_status till -l är ett tal som anger antingen ett signalnummer eller
    utgångsstatusen för en process som avslutas av en signal. Alternativet -L är likvärdigt
    lånat till -l. kill returnerar sant om minst en signal har skickats, eller
    falskt om ett fel uppstår eller om ett ogiltigt alternativ påträffas.

    I början förklarar de hur bash skyddar processerna, för att undvika vissa problem, men det är inte klart för mig hur jag skulle kunna få ett säkert skript att köras som root.
    Det enda jag kan tänka på är att skydda den så här:

    $ katt killppid.sh
    #! / Bin / bash
    om [$ USER == "root"]
    sedan echo Kör inte $ 0 som root !!! det är farligt!
    avsluta
    fi

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

    $

    Använd bash's kill, inte / bin / kill

    Hur kan du se att jag inte är särskilt insatt i bash.
    Vet du hur man skriver ett säkert skript som körs som användaren av den underordnade processen, även om det körs som root?
    något som motsvarar vad som skulle göras manuellt så här:

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