Øvelse – Afslut en proces, der ikke fungerer korrekt

Fuldført

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.

  1. Gå tilbage til hjemmebasen ved at skrive følgende kommando:

    cd ~
    
  2. 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 i vi.

  3. 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.

  4. 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" og q står for "afslut".

  5. 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.

  1. 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
    
  2. 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 navnet killall dræber en proces, der er baseret på procesnavnet. Når du kalder kill, 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
    
  3. 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 det ps -ef output (det er i den anden kolonne), og bruge følgende kommando til at afslutte processen. Erstat PROCESS_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.

  4. 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.