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

Watchdog无法识别RPi.GPIO库问题求助

问题描述

我编写了一个看门狗程序,用于监控Main2.py的运行状态,当脚本出错时自动重启。该程序在监控不包含RPi.GPIO库的文件时可正常运行,但一旦目标脚本引入RPi.GPIO库,看门狗就无法正常识别和处理了。

原看门狗代码

import sys
import subprocess
import psutil
import time

while True:
    # Check if Main.py is already running
    processes = [process for process in psutil.process_iter() if process.name() == 'python' and 'Main2.py' in process.cmdline()]

    if len(processes) == 0:
        # Process is not running, start it
        print('Process is not running, starting it now...')
        # Add your code to start the process here
        subprocess.Popen(['python', 'Main2.py'])

    # Check if all required modules are imported
    try:
        import Ultrasonicky_senzor as us
        import Nadrz
        import Signalizacia
        import Globalne_premenne as gp
    except Exception as e:
        print("Chyba pri načítaní súborov: ", e)
        # Kill the process and start it again
        for process in processes:
            process.kill()
        time.sleep(10)
        continue

    print("Všetky súbory úspešne načítané")
    time.sleep(10)
针对RPi.GPIO的修复方案
  • 问题根源:RPi.GPIO库在导入时会独占GPIO硬件资源,看门狗进程直接导入依赖该库的模块(如Ultrasonicky_senzor等),会和Main2.py进程产生资源冲突,导致导入失败,进而误判目标脚本出错并触发重启,甚至让看门狗自身陷入异常循环。

  • 核心修复步骤:

    1. 移除模块导入检查逻辑:模块是否能正常导入应由Main2.py自身处理,看门狗只需专注监控进程的存活状态,无需重复导入依赖模块。
    2. 优化进程检测规则:
      • 避免仅匹配process.name() == 'python',部分环境中Python3会显示为python3,需兼容两种情况。
      • 结合进程命令行参数精准匹配Main2.py,同时排除僵尸进程等异常状态。

修改后的看门狗代码

import subprocess
import psutil
import time

def is_main_running():
    # 遍历进程,精准匹配运行Main2.py的Python进程
    for process in psutil.process_iter(['pid', 'name', 'cmdline']):
        try:
            cmd_info = process.info
            cmdline = cmd_info['cmdline']
            # 匹配python/python3启动,且命令行包含Main2.py
            if (cmdline and ('python' in cmdline[0] or 'python3' in cmdline[0]) 
                and any('Main2.py' in part for part in cmdline)):
                # 排除僵尸进程,确保进程正常运行
                if process.status() != psutil.STATUS_ZOMBIE:
                    return process
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue
    return None

while True:
    main_process = is_main_running()
    
    if not main_process:
        print('Main2.py未运行,正在启动...')
        # 根据你的Python环境调整为python或python3
        subprocess.Popen(['python3', 'Main2.py'])
    else:
        print(f'Main2.py正在运行,PID: {main_process.pid}')
    
    time.sleep(10)
  • 额外优化建议:
    • 在Main2.py中添加try-except块捕获GPIO相关异常,确保脚本崩溃时能正常退出,让看门狗及时触发重启。
    • 若需要监控脚本运行日志,可将Main2.py的输出重定向到日志文件,看门狗定期检查日志中的错误关键词,实现更精准的故障检测。

内容的提问来源于stack exchange,提问作者Kristonela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:25:10