当一个进程异常退出或根本不退出时,我仍然希望能够收集到那时它可能产生的输出。
此示例代码的明显解决方案是使用 os.kill 终止子进程,但在我的实际代码中,子进程挂起等待 NFS 并且不响应 SIGKILL。
#!/usr/bin/python
import subprocess
import os
import time
import signal
import sys
child_script = """
#!/bin/bash
i=0
while [ 1 ]; do
echo "output line $i"
i=$(expr $i \+ 1)
sleep 1
done
"""
childFile = open("/tmp/childProc.sh", 'w')
childFile.write(child_script)
childFile.close()
cmd = ["bash", "/tmp/childProc.sh"]
finish = time.time() + 3
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
while p.poll() is None:
time.sleep(0.05)
if finish < time.time():
print "timed out and killed child, collecting what output exists so far"
out, err = p.communicate()
print "got it"
sys.exit(0)
在这种情况下,将出现有关超时的打印语句,并且 python 脚本永远不会退出或继续。有谁知道我可以如何以不同的方式做到这一点并且仍然从我的子进程中获得输出