Oefening: een zich misdragend proces beëindigen
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 neemt het te veel CPU-tijd in beslag of reageert het 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.
Ga terug naar uw thuishonk door de volgende opdracht te typen:
cd ~
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 vanvi
kennen.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.
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) enq
voor afsluiten (quit).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
.
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
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 naamkillall
doodt een proces op basis van de procesnaam.) Wanneer u beltkill
, 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
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 vanps -ef
(in de tweede kolom) en gebruikt u de volgende opdracht om het proces te beëindigen. VervangPROCESS_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.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.