Saya rasa saya sudah menemukan jawabannya, masalahnya adalah jika saya melakukan ini
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))
itu akan mematikan proses yang memulai juru bahasa python
>>> Terminated
jadi sebagai gantinya, saya mengatur preexec_fn
ke 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))
di shell lain, jika saya centang
pgrep sleep
tidak ada yang muncul, sehingga benar-benar dibunuh.
Saya memiliki masalah yang sama dengan subproses root tetapi jawabannya di sini dan di sini- Python cara membunuh subproses root tidak bekerja untuk saya.
Pada akhirnya satu-satunya hal yang berhasil adalah:
proc = subprocess.Popen(["sudo", exe_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
.
.
.
os.system("sudo pkill -9 -P " + str(proc.pid))
Tanpa perlu preexec_fn=os.setpgrp
Saat Anda menjalankan pgrep sleep
Anda diperlihatkan PID dari sleep
perintah, dijalankan sebagai turunan dari sudo
proses yang Anda buat.
Sebagai demo cepat, saya menyimpan yang berikut ini sebagai subproc.py
:
import subprocess
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)
Saat menjalankan skrip ini, kita dapat melihat dua proses muncul:
~/$ python subproc.py
Process spawned with PID: 5296
~/$ ps all | grep sleep
0 5296 1 sudo sleep 100
0 5297 5296 sleep 100
Anda akan melihat bahwa PID yang Anda ketahui dalam kode Anda adalah proses sudo 'induk'. Ini adalah proses yang harus Anda hentikan, tetapi Anda harus menggunakan sudo untuk melakukannya:
subprocess.check_call(["sudo", "kill", str(pr.pid)])
#You might want to wait for the process to end:
os.waitpid(pr.pid, 0)