IoT项目中进程挂起/崩溃时如何重启Python脚本?
针对你的IoT双进程高可靠需求,我整理了一套完整的实现方案,包含单实例保障、进程监控、异常处理和开机自启配置,具体如下:
高可靠双进程Python程序实现
核心设计思路
- 用
multiprocessing创建业务子进程,主进程专职做监控,子进程挂掉自动重启 - 借助
pid模块的PidFile确保程序只跑一个实例,避免开机自启时重复启动 - 每个进程的无限循环里加全面异常捕获,防止单个小错误导致整个进程崩溃
- 结合
/etc/rc.local实现开机自启,同时处理日志输出方便排查问题
完整代码示例
import time import multiprocessing from pid import PidFile import traceback def child_process_task(): """子进程的业务逻辑实现""" print("子进程启动,开始执行业务任务...") while True: try: # 👇 这里替换成你的实际IoT业务代码 print("子进程正在运行,处理IoT数据...") time.sleep(5) except Exception as e: # 捕获所有异常,打印详细错误信息后继续运行 print(f"子进程发生异常: {str(e)}") traceback.print_exc() # 异常后短暂休眠,避免短时间内频繁报错 time.sleep(2) def main_process_monitor(): """主进程:负责监控子进程状态,异常时重启""" child_process = None print("主进程启动,开始监控子进程...") while True: # 检查子进程是否存活,不存在或已终止则重启 if not child_process or not child_process.is_alive(): print("检测到子进程异常,启动/重启子进程...") child_process = multiprocessing.Process(target=child_process_task) child_process.daemon = True # 设置为守护进程,主进程退出时子进程自动终止 child_process.start() # 主进程自身的逻辑(如果需要的话) print("主进程运行中,监控子进程状态...") time.sleep(10) try: # 主动清理僵尸进程,避免资源占用 child_process.join(timeout=0) except Exception as e: print(f"主进程监控时发生异常: {str(e)}") traceback.print_exc() time.sleep(2) if __name__ == "__main__": # 使用PidFile确保程序单实例运行,默认pid文件在/tmp目录下 with PidFile(): try: main_process_monitor() except KeyboardInterrupt: print("程序被手动终止") except Exception as e: print(f"主进程发生致命异常: {str(e)}") traceback.print_exc()
关键细节说明
- 单实例保障:通过
with PidFile():上下文管理器,程序启动时会自动检查pid文件,若已有实例运行则直接退出,避免开机自启时多个实例抢占资源。 - 进程监控机制:主进程每隔10秒检查子进程状态,一旦发现子进程挂掉立刻重启,确保IoT业务不中断。
- 全面异常捕获:每个进程的循环内都捕获所有
Exception,并打印堆栈跟踪信息,既能保留错误线索,又不会让进程因为单个异常直接崩溃。 - 守护进程设置:子进程设为守护进程,确保主进程意外退出时,子进程也会随之终止,避免产生孤儿进程浪费系统资源。
开机自启配置(/etc/rc.local)
- 先给你的Python脚本添加可执行权限:
chmod +x /path/to/your/iot_script.py - 编辑
/etc/rc.local文件(如果没有则创建),在exit 0之前添加以下内容:/usr/bin/python3 /path/to/your/iot_script.py > /var/log/iot_script.log 2>&1 &- 注意替换
/usr/bin/python3为你实际的Python解释器路径(可通过which python3查看) - 日志重定向到
/var/log/iot_script.log,方便后续查看程序运行状态和错误信息 - 末尾的
&让程序在后台运行,不阻塞系统启动
- 注意替换
额外可靠性优化建议
- 日志升级:把代码里的
print替换成Python标准库的logging模块,更规范地记录日志级别、时间戳等信息,排查问题更高效。 - 资源监控:可以结合
psutil模块,定期监控进程的CPU、内存占用,及时发现内存泄漏等问题。 - 系统级看门狗:如果需要更高等级的可靠性,可以启用Linux系统的
watchdog服务,不仅能监控进程存活状态,甚至在系统挂起时自动重启系统。
内容的提问来源于stack exchange,提问作者Santosh Bajantri
相关产品推荐
相关产品推荐

