プロセス グループを使用して、グループ内のすべてのプロセスにシグナルを送信できるようにします。そのためには、生成された/子プロセスの親プロセスにセッション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
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
p.kill()
p.kill()
最終的にシェルプロセスを強制終了し、 cmd
まだ実行中です。
これを解決する便利な方法を見つけました:
p = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)
これにより、シェルが強制終了されない子プロセスを起動する代わりに、cmd がシェル プロセスを継承します。 p.pid
その場合、cmd プロセスの ID になります。
p.kill()
動作するはずです。
ただし、これがパイプにどのような影響を与えるかはわかりません.