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进程产生资源冲突,导致导入失败,进而误判目标脚本出错并触发重启,甚至让看门狗自身陷入异常循环。核心修复步骤:
- 移除模块导入检查逻辑:模块是否能正常导入应由
Main2.py自身处理,看门狗只需专注监控进程的存活状态,无需重复导入依赖模块。 - 优化进程检测规则:
- 避免仅匹配
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
相关产品推荐
相关产品推荐

