2017-04-10 5 views
-2

Ich habe eine Flask-Anwendung mit Python3. Manchmal erstellt es einen Daemon-Prozess, um ein Skript auszuführen, dann möchte ich den Daemon bei einem Timeout beenden (verwende signal.SIGINT).Wie kill Prozess, der von Python os.system()

Einige Prozesse, die von os.system (zum Beispiel os.system('git clone xxx')) erstellt wurden, werden jedoch weiterhin ausgeführt, nachdem der Daemon beendet wurde. Was soll ich tun? Danke allen!

+0

Gibt es einen bestimmten Grund, warum Sie 'os.system()' anstelle eines 'subprocess' Aufrufs verwenden, der Ihnen viel bessere Kontrolle über die von Ihnen erstellten Subprozesse gibt? – tripleee

+0

Wahrscheinlich Ignoranz. 'subprocess' ist etwas unklarer und es gibt viele Beispiele, wie man' os.system' immer noch verwenden kann. Obwohl die Dokumentation sagt "Das Unterprozessmodul bietet leistungsfähigere Möglichkeiten zum Erstellen neuer Prozesse und zum Abrufen ihrer Ergebnisse", wissen Sie nur, wenn Sie die Dokumentation lesen ... – holdenweb

Antwort

1

Der folgende Befehl in der Befehlszeile zeigt Ihnen alle laufenden Instanzen von Python.

$ ps aux | grep -i python 
username 6488 0.0 0.0 2434840 712 s003 R+ 1:41PM 0:00.00 python 

Die erste Zahl, 6488, ist die PID, Prozesskennung. Sehen Sie sich die Ausgabe des Befehls auf Ihrem Computer an, um die PID des Prozesses zu finden, den Sie löschen möchten.

Sie können einen anderen Befehl ausführen, um den korrekten Prozess zu beenden.

Möglicherweise müssen Sie sudo mit diesem Befehl verwenden. Sei aber vorsichtig, du willst nicht das Falsche töten, sonst könnte es passieren!

+1

Aber der Subprozess läuft nicht Python. Und wie unterscheiden Sie zwischen mehreren Prozessen, die alle dieselbe Befehlszeile ausführen? – holdenweb

1

Um einen Prozess beenden zu können, benötigen Sie eine Prozess-ID (normalerweise als PID bezeichnet). os.system gibt Ihnen das nicht, einfach den Wert des Rückgabecodes des Subprozesses zurückgeben. Das neue Modul subprocess gibt Ihnen viel mehr Kontrolle, auf Kosten von etwas mehr Komplexität. Insbesondere können Sie auf das Ende des Prozesses warten, ggf. mit einem Timeout, und Sie erhalten Zugriff auf die PID des Subprozesses. Während ich kein Experte in seiner Verwendung bin, scheint dies Arbeit. Beachten Sie, dass dieser Code Python 3.3 oder höher benötigt, um das Argument timeout für den Aufruf Popen.wait zu verwenden.

import subprocess 

process = subprocess.Popen(['git', 'clone', 'https://github.com/username/reponame']) 
try: 
    print('Running in process', process.pid) 
    process.wait(timeout=10) 
except subprocess.TimeoutExpired: 
    print('Timed out - killing', process.pid) 
    process.kill() 
print("Done") 
+1

es funktioniert, danke! – bawuju

Verwandte Themen