Ich glaube, ich habe es herausgefunden, das Problem war, dass ich dies getan habe
import subprocess, os
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)
pgid = os.getpgid(pr.pid)
subprocess.check_output("sudo kill {}".format(pgid))
es würde den Prozess beenden, der den Python-Interpreter gestartet hat
>>> Terminated
also setze ich stattdessen den preexec_fn
bis os.setpgrp
import subprocess, os
pr = subprocess.Popen(["sudo", "sleep", "100"], preexec_fn=os.setpgrp)
print("Process spawned with PID: %s" % pr.pid)
pgid = os.getpgid(pr.pid)
subprocess.check_output("sudo kill {}".format(pgid))
in einer anderen Shell, wenn ich
überprüfepgrep sleep
es wird nichts angezeigt, also wird es tatsächlich getötet.
Ich hatte das gleiche Problem mit dem Root-Subprozess, aber die Antworten hier und hier - Python, wie man den Root-Subprozess beendet, haben bei mir nicht funktioniert.
Am Ende hat nur folgendes funktioniert:
proc = subprocess.Popen(["sudo", exe_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
.
.
.
os.system("sudo pkill -9 -P " + str(proc.pid))
Ohne die Notwendigkeit von preexec_fn=os.setpgrp
Wenn Sie pgrep sleep
ausführen Ihnen wird die PID der sleep
angezeigt Befehl, der als untergeordnetes Element von sudo
ausgeführt wird Prozess, den Sie erstellt haben.
Als kurze Demo habe ich Folgendes als subproc.py
gespeichert :
import subprocess
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)
Wenn wir dieses Skript ausführen, sehen wir zwei erzeugte Prozesse:
~/$ python subproc.py
Process spawned with PID: 5296
~/$ ps all | grep sleep
0 5296 1 sudo sleep 100
0 5297 5296 sleep 100
Sie werden feststellen, dass die PID, die Sie in Ihrem Code kennen, der „übergeordnete“ sudo-Prozess ist. Dies ist der Prozess, den Sie beenden sollten, aber dazu müssen Sie sudo verwenden:
subprocess.check_call(["sudo", "kill", str(pr.pid)])
#You might want to wait for the process to end:
os.waitpid(pr.pid, 0)