Övning – Avbryta en felaktig process
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. Kanske tar det upp för mycket CPU-tid, eller så slutade det kanske 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.
Gå tillbaka till starten genom att skriva följande kommando:
cd ~
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 omvi
är det viktigt för Bash-användare att känna till grunderna om det.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.
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), ochq
står för "quit" (avsluta).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
.
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
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 namnetkillall
dödar en process baserat på processnamnet.) När du anroparkill
må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
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ånps -ef
-utdata (det finns i den andra kolumnen) och använd följande kommando för att avbryta processen. ErsättPROCESS_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.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.