如何用单个Shell脚本防止树莓派上多个Python脚本崩溃?
用单个Shell脚本监控多个Python脚本的方案
当然可以用同一个Shell脚本搞定两个Python脚本的监控,完全不用新建第二份脚本!下面给你两种实用的修改方案,选哪种都能达到目的:
方案一:封装监控逻辑为函数(推荐)
把检查单个Python脚本是否运行、崩溃后重启的逻辑做成一个可复用的函数,之后只要传入不同脚本的路径和标识名就能分别监控,代码更整洁,后续再加更多脚本也方便扩展。
示例脚本如下:
#!/bin/bash # 定义通用监控函数: # 参数1:要监控的Python脚本绝对路径 # 参数2:脚本的标识名(用来区分日志里的不同脚本) monitor_python() { target_script="$1" script_alias="$2" # 通过脚本路径精确匹配进程,避免误判同名进程 if ! pgrep -f "$target_script" > /dev/null; then # 记录重启日志,方便排查问题 echo "$(date '+%Y-%m-%d %H:%M:%S'): $script_alias 已崩溃,正在重启..." >> /var/log/python_script_monitor.log # 后台启动脚本,并把输出日志单独保存(可选,方便排查脚本崩溃原因) python3 "$target_script" >> "/var/log/${script_alias}_runtime.log" 2>&1 & fi } # 调用函数监控第一个Python脚本 monitor_python "/home/pi/your_scripts/first_script.py" "FirstScript" # 调用函数监控第二个Python脚本 monitor_python "/home/pi/your_scripts/second_script.py" "SecondScript"
方案二:直接写重复检查逻辑
如果觉得函数太麻烦,也可以直接在脚本里写两段独立的检查重启代码,逻辑简单直接,适合新手快速上手:
#!/bin/bash # 监控第一个Python脚本 first_script="/home/pi/your_scripts/first_script.py" if ! pgrep -f "$first_script" > /dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S'): 第一个脚本已崩溃,正在重启..." >> /var/log/python_script_monitor.log python3 "$first_script" >> /var/log/first_script_runtime.log 2>&1 & fi # 监控第二个Python脚本 second_script="/home/pi/your_scripts/second_script.py" if ! pgrep -f "$second_script" > /dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S'): 第二个脚本已崩溃,正在重启..." >> /var/log/python_script_monitor.log python3 "$second_script" >> /var/log/second_script_runtime.log 2>&1 & fi
额外注意事项
- 给Shell脚本加执行权限:运行
chmod +x /home/pi/your_scripts/monitor.sh(替换成你的脚本路径),确保cron能正常执行它。 - 设置cron定时检测:编辑cron任务(
crontab -e),添加一行比如*/5 * * * * /home/pi/your_scripts/monitor.sh,意思是每隔5分钟运行一次监控脚本,及时发现崩溃并重启。 - 日志管理:可以定期清理日志文件,避免占满存储空间,比如用Linux自带的
logrotate工具配置自动轮转日志。
内容的提问来源于stack exchange,提问作者Craver2000
相关产品推荐
相关产品推荐

