Myslím, že jsem na to přišel, problém byl v tom, že kdybych to udělal
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))
zabilo by to proces, který spustil interpret pythonu
>>> Terminated
místo toho jsem nastavil preexec_fn
do 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))
v jiném prostředí, pokud zkontroluji
pgrep sleep
nic se neobjeví, takže je ve skutečnosti zabit.
Měl jsem stejný problém s kořenovým podprocesem, ale odpovědi zde a zde - Python jak zabít kořenový podproces mi nefungovaly.
Na konci jediné, co fungovalo, bylo:
proc = subprocess.Popen(["sudo", exe_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
.
.
.
os.system("sudo pkill -9 -P " + str(proc.pid))
Bez potřeby preexec_fn=os.setpgrp
Když spustíte pgrep sleep
zobrazí se vám PID sleep
spuštěný jako podřízený příkaz sudo
proces, který jste vytvořili.
Jako rychlou ukázku jsem uložil následující jako subproc.py
:
import subprocess
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)
Při spuštění tohoto skriptu můžeme vidět dva procesy vytvořené:
~/$ python subproc.py
Process spawned with PID: 5296
~/$ ps all | grep sleep
0 5296 1 sudo sleep 100
0 5297 5296 sleep 100
Všimnete si, že PID, o kterém víte ve svém kódu, je „rodičovský“ proces sudo. Toto je proces, který byste měli zabít, ale budete k tomu muset použít sudo:
subprocess.check_call(["sudo", "kill", str(pr.pid)])
#You might want to wait for the process to end:
os.waitpid(pr.pid, 0)