Oefening: een zich misdragend proces beëindigen

Voltooid

Computers zijn niet perfect. Vroeg of laat gaat er altijd iets fout. Daarom hebt u een baan als systeembeheerder; het is aan u om problemen in het systeem te diagnosticeren en op te lossen.

Stel dat een Python-toepassing problemen veroorzaakt. Misschien gebruikt de toepassing te veel CPU-tijd of reageert deze niet meer. In beide gevallen wilt u de toepassing stoppen. Als u een proces of toepassing wilt identificeren, kunt u ps en grep gebruiken. Vervolgens kunt u de opdracht kill gebruiken om de toepassing te stoppen. Laten we dit oefenen in uw virtuele Linux-machine.

Een zich misdragend proces starten

Als u een proces wilt afsluiten, hebt u een proces nodig om af te sluiten. We gaan er een maken.

  1. Ga terug naar uw thuishonk door de volgende opdracht te typen:

    cd ~
    
  2. Voer in Azure Cloud Shell de volgende opdracht uit om de vi-editor van Linux te starten:

    vi bad.py
    

    vi is een veelgebruikte teksteditor die door Linux is overgenomen van Unix. Of u het nu leuk vindt of niet, iedere Bash-gebruiker moet de basisbeginselen van vi kennen.

  3. Selecteer de i-toets om vi in de invoegmodus te zetten. Typ vervolgens het volgende Python-programma:

    i = 0
    while i == 0:
        pass
    

    Wanneer dit programma wordt uitgevoerd komt het in een oneindige lus; duidelijk niet iets dat u op uw server wilt hebben.

  4. Selecteer de Esc-toets om uit de invoegmodus te gaan. Typ vervolgens de volgende opdracht, gevolgd door Enter om het programma op te slaan en vi af te sluiten:

    :wq
    

    Zorg ervoor dat u de dubbele punt aan het begin van de opdracht typt. Wat de rest van de opdracht betreft: w staat voor schrijven (write) en q voor afsluiten (quit).

  5. Gebruik nu de volgende opdracht om het programma te starten en het op de achtergrond uit te voeren:

    python3 bad.py &
    

    Zorg ervoor dat u het en-teken (&) aan het einde van de opdracht opneemt. Anders komt u niet terug bij de Bash-prompt. In Bash voert de ampersand een opdracht uit en gaat terug naar de opdrachtregel, zelfs als de opdracht nog niet is uitgevoerd.

Het is niet meteen duidelijk, maar bad.py wordt nu uitgevoerd op de achtergrond en steelt CPU-cycli van andere processen. Laten we eens kijken wat er gebeurt.

Het proces beëindigen

Als u een proces wilt beëindigen, hebt u de naam of de proces-id van het proces nodig. Dat is een taak voor ps.

  1. Zoals u weet wordt met de opdracht ps -ef een lijst gemaakt van alle actieve processen, waarbij veel informatie over elk ervan wordt weergegeven. Gebruik de volgende opdracht om een lijst met alle actieve processen weer te geven en de resultaten te filteren op regels die 'python' bevatten:

    ps -ef | grep python
    

    Het resultaat zou er ongeveer zo uit moeten zien:

    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. Uit de lijst blijkt dat bad.py 99 procent van de CPU-tijd van de server verbruikt. Het programma doet zijn naam eer aan.

    Met de opdracht kill wordt een actief proces beëindigd op basis van de proces-id. (Een gerelateerde opdracht met de naam killall doodt een proces op basis van de procesnaam.) Wanneer u belt kill, moet u beslissen welk soort "signaal" moet worden gebruikt om het proces te doden. Gebruik de volgende opdracht om een lijst met signaaltypen weer te geven:

    kill -l
    
  3. Als u een daemonproces wilt beëindigen (een proces dat op de achtergrond wordt uitgevoerd en belangrijke services biedt aan het besturingssysteem) wilt u het proces waarschijnlijk beëindigen en meteen opnieuw opstarten. Hiervoor kunt u een SIGHUP-signaal gebruiken.

    In dit voorbeeld wilt u het proces beëindigen zonder het opnieuw op te starten. Daarom gebruikt u het SIGKILL-signaal, dat overeenkomt met het getal 9. Daartoe zoekt u de proces-id van bad.py op in de uitvoer van ps -ef (in de tweede kolom) en gebruikt u de volgende opdracht om het proces te beëindigen. Vervang PROCESS_ID door de proces-id.

    kill -9 PROCESS_ID
    

    Dezelfde opdracht kan ook worden ingevoerd als kill -s SIGKILL PROCESS_ID. U moet zelf weten of u de naam of het nummer van een signaal gebruikt.

  4. Voltooi de oefening door ps nogmaals uit te voeren om te bevestigen dat bad.py niet meer wordt uitgevoerd.

Een ander veelvoorkomend gebruik voor ps en kill is het identificeren en beëindigen van 'zombieprocessen': onderliggende processen die worden achtergelaten door slecht geschreven programma's.