Python脚本关闭重启后如何恢复之前启动的subprocess子进程?
问题解答
能否通过保存subprocess对象状态恢复子进程?
不能。你打印subprocess对象时看到的subprocess object created at <0x00123abc>中的内存地址,是当前主进程私有虚拟地址空间内的地址,仅在本次主进程运行的生命周期内有效。主进程退出后,操作系统会回收整个主进程的地址空间,该地址会完全失效。即使你将subprocess对象序列化存储到磁盘,重启主进程后重新加载该对象,也无法和之前启动的子进程建立任何关联。
实现主进程重启后子进程继续运行的方案
你可以按照以下思路实现需求:
- 第一步让子进程脱离主进程的生命周期控制,避免主进程退出时子进程被系统连带终止:
- Linux/macOS环境:创建Popen对象时添加参数
preexec_fn=os.setpgrp,让子进程运行在独立会话组中,不会收到主进程退出时发送的SIGHUP信号 - Windows环境:创建Popen对象时添加参数
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP,或者使用shell=True时在命令前加start前缀,让子进程独立于主进程运行
- Linux/macOS环境:创建Popen对象时添加参数
- 如果你重启主进程后需要管理之前启动的子进程,可以在首次启动子进程时,将子进程的PID(进程ID,通过
process.pid即可获取)写入本地文件存储。主进程重启后读取该文件的PID值,即可通过操作系统的进程管理接口对已有子进程进行状态查询、信号发送等操作。 - 你当前的代码配置了
stdout=subprocess.PIPE、stderr=subprocess.PIPE,这两个管道是主进程和子进程之间的专属IO通道,主进程退出后管道会被销毁,子进程如果继续往管道写入数据会触发异常导致崩溃。如果需要子进程长期后台运行,建议将stdout、stderr重定向到本地磁盘文件,或者重定向到/dev/null(Linux)/nul(Windows),不要使用PIPE参数。
内容的提问来源于stack exchange,提问作者Ruchit Micro
相关产品推荐
相关产品推荐

