私はそれを理解したと思います、問題は私がこれをやった場合でした
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))
Pythonインタープリターを開始したプロセスを強制終了します
>>> Terminated
代わりに、 preexec_fn
を設定します 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))
チェックすると、別のシェルで
pgrep sleep
何も表示されないため、実際に殺されます。
ルート サブプロセスでも同じ問題がありましたが、こことここの回答 - Python でルート サブプロセスを強制終了する方法がうまくいきませんでした。
最後に唯一うまくいったのは:
proc = subprocess.Popen(["sudo", exe_path], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
.
.
.
os.system("sudo pkill -9 -P " + str(proc.pid))
preexec_fn=os.setpgrp
を必要としない
pgrep sleep
を実行すると sleep
の PID が表示されます sudo
の子として実行されるコマンド
簡単なデモとして、以下を subproc.py
として保存しました :
import subprocess
pr = subprocess.Popen(["sudo", "sleep", "100"])
print("Process spawned with PID: %s" % pr.pid)
このスクリプトを実行すると、次の 2 つのプロセスが生成されていることがわかります。
~/$ python subproc.py
Process spawned with PID: 5296
~/$ ps all | grep sleep
0 5296 1 sudo sleep 100
0 5297 5296 sleep 100
コードで知っている PID が「親」の sudo プロセスであることがわかります。これは強制終了する必要があるプロセスですが、これを行うには sudo を使用する必要があります:
subprocess.check_call(["sudo", "kill", str(pr.pid)])
#You might want to wait for the process to end:
os.waitpid(pr.pid, 0)