When the process crashes abnormally or does not work at all, I still want to be able to collect what result he could create to this point.
The obvious solution to this code example is to kill the child process with os.kill, but in my real code the child is waiting for NFS and not responding to SIGKILL.
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)
In this case, a print expression about the timing appears and the python script never exits or progresses. Does anyone know how I can do this differently and still get output from my child process
source
share