Python子进程的管道能在程序重启时重新连接到原始子进程吗?
我在寻找一种安全的方法来重启我的Python程序,并且能够重新控制之前启动的子进程。
我使用了子进程和线程来监控一个长时间运行的command
,这个命令会不断产生一些输出信息。
下面是一个示例代码片段:
class PS(threading.Thread):
def __init__(self, command):
threading.Thread.__init__(self)
self.command = command
def run(self):
try:
process = subprocess.Popen(self.command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in iter(process.stdout.readline, ''):
''' do something to line'''
当我的Python主程序被终止(比如杀掉它的进程ID)时,它的子进程(由PS
类执行的command
)仍然作为后台进程在运行。
我的问题是,Python中有没有办法“重新连接”这个子进程,这样我就可以继续监控它的stdout
和stderr
输出?
附注:我只需要在Linux环境下,具体来说是在Ubuntu 14.04上。
1 个回答
1
当子进程的标准输出连接到一个管道时,如果子进程在父进程死掉后还试图往这个管道写数据,就会收到一个叫做SIGPIPE的信号,因为管道的另一端已经不存在了。
为了确保子进程能够继续运行而不受父进程影响,并且让父进程可以继续工作,你可以选择把数据写入一个文件,然后让父进程从这个文件中读取数据。