Python子进程的管道能在程序重启时重新连接到原始子进程吗?

2 投票
1 回答
1065 浏览
提问于 2025-04-18 17:39

我在寻找一种安全的方法来重启我的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中有没有办法“重新连接”这个子进程,这样我就可以继续监控它的stdoutstderr输出?

附注:我只需要在Linux环境下,具体来说是在Ubuntu 14.04上。

1 个回答

1

当子进程的标准输出连接到一个管道时,如果子进程在父进程死掉后还试图往这个管道写数据,就会收到一个叫做SIGPIPE的信号,因为管道的另一端已经不存在了。

为了确保子进程能够继续运行而不受父进程影响,并且让父进程可以继续工作,你可以选择把数据写入一个文件,然后让父进程从这个文件中读取数据。

撰写回答