次のコマンドでサブプロセスを起動します。
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
ただし、以下を使用して強制終了しようとすると、
p.terminate()
または
p.kill()
コマンドはバックグラウンドで実行され続けるので、実際にプロセスを終了するにはどうすればよいのか疑問に思っていました。
次のコマンドを実行すると、次の点に注意してください。
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
を発行すると正常に終了しますp.terminate()
。
ベストアンサー1
使うプロセスグループグループ内のすべてのプロセスにシグナルを送信できるようにするには、セッションID生成された/子プロセスの親プロセス (この場合はシェル) にシグナルを送信します。これにより、プロセスのグループ リーダーになります。これで、プロセス グループ リーダーにシグナルが送信されると、このグループのすべての子プロセスにシグナルが送信されます。
コードは次のとおりです:
import os
import signal
import subprocess
# The os.setsid() is passed in the argument preexec_fn so
# it's run after the fork() and before exec() to run the shell.
pro = subprocess.Popen(cmd, stdout=subprocess.PIPE,
shell=True, preexec_fn=os.setsid)
os.killpg(os.getpgid(pro.pid), signal.SIGTERM) # Send the signal to all the process groups