Øvelse – Afslut en proces, der ikke fungerer korrekt
Computere er ufuldkomne. Før eller senere vil noget gå galt. Det er derfor, du har et job som sysadmin; det er op til dig at foretage fejlfinding og løse systemproblemer.
Forestil dig, at et Python-program forårsager problemer. Måske tager det for meget CPU-tid, eller måske er det holdt op med at svare. I begge tilfælde vil du stoppe programmet. Hvis du vil identificere en proces eller et program, kan du bruge ps
og grep
. Derefter kan du bruge kommandoen kill
for at stoppe den. Lad os øve dette i din virtuelle Linux-maskine.
Start en proces, hvor der ikke fungerer korrekt
Hvis du vil dræbe en proces, skal du bruge en proces for at dræbe. Lad os oprette en.
Gå tilbage til hjemmebasen ved at skrive følgende kommando:
cd ~
I Azure Cloud Shell skal du angive følgende kommando for at starte Linux's
vi
-editor:vi bad.py
vi
er en meget brugt teksteditor, som Linux nedarvede fra Unix. Elsker det eller hader det, en Bash bruger skal kende det grundlæggende ivi
.Vælg i for at sætte
vi
i indsætningstilstand. Skriv derefter følgende Python-program:i = 0 while i == 0: pass
Når dette program udføres, kører det i en uendelig løkke – det er helt klart ikke noget, du vil køre på din server.
Vælg Esc- for at afslutte indsætningen. Skriv derefter følgende kommando efterfulgt af nøglen Enter for at gemme programmet og afslutte
vi
::wq
Husk at medtage kolonet i starten af kommandoen. Med hensyn til resten af kommandoen står
w
for "skriv" ogq
står for "afslut".Brug nu følgende kommando til at starte programmet og lade det køre i baggrunden:
python3 bad.py &
Sørg for at medtage tegnet (
&
) i slutningen af kommandoen. Ellers vender du ikke tilbage til Bash-prompten. I Bash kører og-tegnet en kommando og vender tilbage til kommandolinjen, selvom kommandoen ikke er færdig med at køre.
Det er ikke indlysende, men bad.py kører nu i baggrunden og stjæler CPU-cyklusser fra andre processer. Lad os se nærmere på, hvad der sker.
Dræb processen
Hvis du vil dræbe en proces, skal du bruge procesnavnet eller proces-id'et. Dette er et job til ps
.
Hvis du vil opdatere hukommelsen, vises alle kørende processer i en
ps -ef
kommando, og der vises mange oplysninger om hver enkelt. Brug følgende kommando til at få vist alle kørende processer og filtrere resultaterne efter linjer, der indeholder "python":ps -ef | grep python
Resultaterne bør se nogenlunde sådan ud:
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
Fra listen fremgår det, at bad.py bruger 99 procent af serverens CPU-tid. Programmet lever op til sit navn.
Kommandoen
kill
dræber en kørende proces baseret på proces-id'et. En relateret kommando med navnetkillall
dræber en proces, der er baseret på procesnavnet. Når du kalderkill
, skal du beslutte, hvilken slags "signal" der skal bruges til at dræbe processen. Brug følgende kommando til at få vist en liste over signaltyper:kill -l
Hvis du dræbte en daemonproces – en proces, der kører i baggrunden og leverer vigtige tjenester til operativsystemet – kan det være en god idé at dræbe den og straks genstarte den. For at gøre det kan du bruge et
SIGHUP
signal.I dette eksempel vil du afslutte processen uden at genstarte den. Du vil derfor bruge signalet
SIGKILL
, som svarer til tallet 9. Til dette formål skal du hente bad.pyproces-id fra detps -ef
output (det er i den anden kolonne), og bruge følgende kommando til at afslutte processen. ErstatPROCESS_ID
med proces-id'et.kill -9 PROCESS_ID
Den samme kommando kan også angives som
kill -s SIGKILL PROCESS_ID
. Det er op til dig, om du bruger et signals navn eller nummer.Afslut med at køre
ps
igen for at bekræfte, at bad.py ikke længere kører.
En anden almindelig brug for ps
og kill
er at identificere og afslutte "zombie processer", som er underordnede processer efterladt af dårligt skrevne programmer.