Övning – Avbryta en felaktig process

Slutförd

Datorer är inte perfekta. Förr eller senare kommer något att gå snett. Det är därför du arbetar som systemadministratör. Det är upp till dig att felsöka och åtgärda systemproblem.

Föreställ dig att ett Python-program orsakar problem. Det kanske tar upp för mycket CPU-tid, eller så har det slutat svara. Oavsett vilket vill du stoppa programmet. Du kan identifiera en process eller ett program med hjälp av ps och grep. Sedan kan du stoppa det med kommandot kill. Låt oss öva på detta på din virtuella Linux-dator.

Starta en felaktig process

För att avbryta en process behöver du en process som kan avbrytas. Vi tar och skapar en.

  1. Gå tillbaka till starten genom att skriva följande kommando:

    cd ~
    
  2. I Azure Cloud Shell anger du följande kommando för att starta Linux vi-redigeringsprogram:

    vi bad.py
    

    vi är ett populärt redigeringsprogram som Linux ärvde från Unix. Oavsett vad man tycker om vi är det viktigt för Bash-användare att känna till grunderna om det.

  3. Välj tangenten i för att placera vi i infogningsläge. Skriv sedan följande Python-program:

    i = 0
    while i == 0:
        pass
    

    När det här programmet startas körs det i en oändlig loop, vilket du definitivt inte vill ha på din server.

  4. Välj tangenten Esc för att avsluta infogningsläget. Skriv sedan följande kommando följt av tangenten Retur för att spara programmet och avsluta vi:

    :wq
    

    Se till att inkludera kolonet i början av kommandot. Vad gäller resten av kommandot står w "write" (skriv), och q står för "quit" (avsluta).

  5. Använd nu följande kommando för att starta programmet och låt det köras i bakgrunden:

    python3 bad.py &
    

    Se till att inkludera et-tecknet (&) i slutet av kommandot. Annars återgår du inte till Bash-prompten. I Bash kör et-tecknet ett kommando och återgår till kommandoraden, även om kommandot inte har körts klart.

bad.py körs nu i bakgrunden, trots att detta inte är uppenbart, och stjäl CPU-cykler från andra processer. Vi tittar närmare på vad som händer.

Avbryta processen

Fra avbryta en process behöver du processnamnet eller process-ID. Den uppgiften faller på ps.

  1. Kommandot ps -ef visar alltså en lista över alla processer som körs samt gedigen information om var och en. Använd följande kommando för att visa alla processer som körs och filtrera resultatet till rader som innehåller "python":

    ps -ef | grep python
    

    Resultatet bör se ut ungefär så här:

    yourname+    342    254 99 23:34 pts/1    00:00:31 python3 bad.py
    yourname+    344    254  0 23:35 pts/1    00:00:00 grep --color=auto python
    
  2. I listan framgår det att bad.py förbrukar 99 procent av serverns CPU-tid. Programmet lever verkligen upp till sitt namn.

    Kommandot kill avbryter en process som körs baserat på dess process-ID. (Ett relaterat kommando med namnet killall dödar en process baserat på processnamnet.) När du anropar killmåste du bestämma vilken typ av "signal" som ska användas för att döda processen. Använd följande kommando för att visa en lista över signaltyper:

    kill -l
    
  3. Om du avbryter en daemon-process – en som körs i bakgrunden och tillhandahåller viktiga tjänster till operativsystemet – vill du kanske avbryta och omedelbart starta om den. Det kan du göra med en SIGHUP-signal.

    I det här exemplet vill du avbryta processen utan att starta om den. Därför bör du använda SIGKILL-signalen, som motsvarar numret 9. Hämta därför process-ID för bad.py från ps -ef-utdata (det finns i den andra kolumnen) och använd följande kommando för att avbryta processen. Ersätt PROCESS_ID med process-ID.

    kill -9 PROCESS_ID
    

    Samma kommando kan även anges som kill -s SIGKILL PROCESS_ID. Du väljer själv om du vill använda namnet eller numret för en signal.

  4. Avsluta genom att köra ps igen för att bekräfta att bad.py inte längre körs.

Ett annat vanligt sätt att använda ps och kill är att identifiera och avbryta "zombieprocesser", det vill säga underordnade processer som lämnas kvar av dåligt skrivna program.