我想知道在终止在不同线程中启动的子进程时是否可以关闭通信管道。如果我不调用communicate(),那么kill() 将按预期工作,在一秒而不是五秒后终止进程。
我在这里找到了一个类似问题的讨论,但我没有得到真正的答案。我假设我必须能够关闭管道或显式终止子子进程(在示例中为“睡眠”)并终止它以解除管道阻塞。
我也试图在 SO 上找到她的答案,但我只找到了 this和this和this,据我所知,它们并没有直接解决这个问题(?)。
所以我想做的是能够在第二个线程中运行一个命令并获得它的所有输出,但是当我想要的时候能够立即杀死它。我可以通过一个文件并跟踪它或类似的东西,但我认为应该有更好的方法来做到这一点?
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