別のスレッドで起動されたサブプロセスを強制終了するときに、通信パイプをシャットダウンすることは可能でしょうか。communicate() を呼び出さない場合、kill() は期待どおりに機能し、5 秒ではなく 1 秒後にプロセスが終了します。
ここで同様の問題に関する議論を見つけましたが、本当の答えは得られませんでした。パイプを閉じるか、サブサブプロセス (この例では「スリープ」) を明示的に強制終了し、それを強制終了してパイプのブロックを解除できる必要があると思います。
私も SO で彼女の答えを見つけようとしましたが、私が知る限り、この問題に直接対処していないthisとthisとthisしか見つかりませんでした (?)。
したがって、私がやりたいことは、2 番目のスレッドでコマンドを実行してすべての出力を取得できるようにすることですが、必要なときにすぐに強制終了できるようにすることです。私はファイルを経由してそれを尾行することもできますが、これを行うためのより良い方法があるはずだと思いますか?
import subprocess, time
from threading import Thread
process = None
def executeCommand(command, runCommand):
Thread(target=runCommand, args=(command,)).start()
def runCommand(command):
global process
args = command.strip().split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
if line:
print "process:", line,
if __name__ == '__main__':
executeCommand("./ascript.sh", runCommand)
time.sleep(1)
process.kill()
これはスクリプトです:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
出力
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s