Объект Python subprocess.Popen зависает, собирая дочерний вывод, когда дочерний процесс не завершается

Когда процесс завершается ненормально или не завершается вообще, я все еще хочу иметь возможность собирать, какой вывод он мог генерировать до этого момента.

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

Ответы на вопрос(4)

Ваш ответ на вопрос