Übung: Beenden eines fehlerhaften Prozesses
Computer sind nicht perfekt. Früher oder später wird etwas schiefgehen. Dies ist der Grund, weshalb Sie die Stelle eines Systemadministrators besetzen: Es liegt in Ihrer Verantwortung, Systemprobleme zu finden und zu beheben.
Stellen Sie sich vor, dass eine Python-Anwendung Probleme verursacht. Vielleicht beansprucht sie zu viel CPU-Zeit, oder sie reagiert nicht mehr. In jedem Fall möchten Sie die Anwendung beenden. Um einen Prozess oder eine Anwendung zu identifizieren, können Sie ps
und grep
verwenden. Anschließend können Sie den Befehl kill
verwenden, um den Prozess oder die Anwendung zu beenden. Üben Sie dies nun in Ihrem virtuellen Linux-Computer.
Starten eines fehlerhaften Prozesses
Da Sie einen Prozess mit kill beenden möchten, benötigen Sie einen Prozess, der mit kill zu beenden ist. Erstellen Sie nun einen solchen Prozess.
Kehren Sie zu ihrem Stammverzeichnis zurück, indem Sie den folgenden Befehl eingeben:
cd ~
Geben Sie in Azure Cloud Shell den folgenden Befehl ein, um den
vi
-Editor von Linux zu starten:vi bad.py
vi
ist ein häufig verwendeter Text-Editor, den Linux von Unix geerbt hat. Lieben oder hassen Sie diesen Editor, ein Bash-Benutzer muss die Grundlagen vonvi
kennen.Drücken Sie die Taste i, um
vi
in den Einfügemodus zu schalten. Geben Sie dann das folgende Python-Programm ein:i = 0 while i == 0: pass
Dieses Programm wird, nachdem es gestartet wurde, in einer Endlosschleife ausgeführt – eindeutig ein Programm, das Sie nicht auf Ihrem Server ausführen möchten.
Drücken Sie die ESC-TASTE, um den Einfügemodus zu beenden. Geben Sie dann den folgenden Befehl ein, und drücken Sie die EINGABE-TASTE, um das Programm zu speichern und
vi
zu beenden::wq
Sie dürfen nicht vergessen, den Doppelpunkt an den Anfang des Befehls zu setzen. Hinsichtlich der restlichen Befehlsteile gilt, dass
w
für „write“ undq
für „quit“ steht.Verwenden Sie nun den folgenden Befehl, um das Programm zu starten und es im Hintergrund ausführen zu lassen:
python3 bad.py &
Achten Sie darauf, dass Sie ein kaufmännisches Und-Zeichen (
&
) an das Ende des Befehls setzen. Andernfalls erfolgt keine Rückkehr zur Bash-Eingabeaufforderung. In Bash bewirkt das kaufmännische Und-Zeichen, dass ein Befehl ausgeführt wird und selbst dann eine Rückkehr zur Befehlszeile erfolgt, wenn die Befehlsausführung nicht beendet wurde.
Es ist nicht direkt zu erkennen, aber bad.py wird jetzt im Hintergrund ausgeführt und stiehlt CPU-Zyklen von anderen Prozessen. Sehen Sie sich genauer an, was passiert.
Beenden des Prozesses mit kill
Um einen Prozess beenden zu können, benötigen Sie den Prozessnamen oder die Prozess-ID. Dies erledigen Sie mit ps
.
Zur Erinnerung: Ein
ps -ef
-Befehl listet alle aktiven Prozesse auf und zeigt zu jedem dieser Prozesse eine Vielzahl von Informationen an. Verwenden Sie den folgenden Befehl, um alle aktiven Prozesse aufzulisten und die Ergebnisse nach Zeilen zu filtern, die „python“ enthalten:ps -ef | grep python
Die Ergebnisse sollten in etwa wie folgt aussehen:
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
Aus der Auflistung geht hervor, dass bad.py 99 Prozent der CPU-Zeit des Servers beansprucht. Das Programm macht seinem Namen alle Ehre.
Der Befehl
kill
beendet einen aktiven Prozess anhand dessen Prozess-ID. (Ein verwandter Befehl namenskillall
beendet einen Prozess anhand des Prozessnamens.) Wenn Siekill
aufrufen, müssen Sie entscheiden, welche Art von „Signal“ dazu verwendet werden soll, den Prozess zu beenden. Verwenden Sie den folgenden Befehl, um eine Liste der Signaltypen anzuzeigen:kill -l
Wenn Sie einen Daemon-Prozess – ein Prozess, der im Hintergrund ausgeführt wird und wichtige Dienste für das Betriebssystem bereitstellt – beenden möchten, ist es wahrscheinlich, dass Sie ihn nach dem Beenden sofort neu starten möchten. Dazu könnten Sie ein
SIGHUP
-Signal verwenden.In diesem Beispiel möchten Sie den Prozess beenden, ohne ihn neu zu starten. Daher sollten Sie das
SIGKILL
-Signal verwenden, das der Zahl 9 entspricht. Suchen Sie zu diesem Zweck die Prozess-ID von bad.py in der Ausgabe vonps -ef
(die ID befindet sich in der zweiten Spalte), und verwenden Sie den folgenden Befehl, um den Prozess zu beenden. Ersetzen SiePROCESS_ID
durch die Prozess-ID.kill -9 PROCESS_ID
Der gleiche Befehl kann auch als
kill -s SIGKILL PROCESS_ID
eingegeben werden. Es liegt in Ihrer Entscheidung, ob Sie den Namen oder die Nummer eines Signals verwenden.Führen Sie schließlich
ps
erneut aus, um zu bestätigen, dass bad.py nicht mehr ausgeführt wird.
Eine weitere häufige Verwendung für ps
und kill
besteht darin, „Zombie-Prozesse“ zu erkennen und zu beenden. Bei diesen Prozessen handelt es sich um untergeordnete Prozesse, die von schlecht geschriebenen Programmen hinterlassen werden.