You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

  1. 先给你的Python脚本添加可执行权限:
    chmod +x /path/to/your/iot_script.py
    
  2. 编辑/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:57:20