Übung: Beenden eines fehlerhaften Prozesses

Abgeschlossen

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.

  1. Kehren Sie zu ihrem Stammverzeichnis zurück, indem Sie den folgenden Befehl eingeben:

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

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

  4. 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“ und q für „quit“ steht.

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

  1. 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
    
  2. 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 namens killall beendet einen Prozess anhand des Prozessnamens.) Wenn Sie kill 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
    
  3. 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 von ps -ef (die ID befindet sich in der zweiten Spalte), und verwenden Sie den folgenden Befehl, um den Prozess zu beenden. Ersetzen Sie PROCESS_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.

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