Когда процесс завершается ненормально или не завершается вообще, я все еще хочу иметь возможность собирать, какой вывод он мог генерировать до этого момента.
Очевидное решение этого примера кода - уничтожить дочерний процесс с помощью 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)
В этом случае появляется сообщение print о тайм-ауте, и скрипт python никогда не завершается и не прогрессирует. Кто-нибудь знает, как я могу сделать это по-другому и все же получить вывод из моего дочернего процесса