树莓派Python脚本出错或中断时自动重启方案咨询
我之前在树莓派上维护过类似的24小时不间断运行的串口通信脚本,太懂这种时不时崩溃、半夜还要爬起来重启的痛苦了!给你几个亲测有效的自动重启方案,从简单易上手到稳定可靠的都有,按需选择:
方案1:Shell脚本基础监控(新手友好)
如果不想折腾复杂工具,用个简单的Shell脚本定时检查进程就行,步骤很简单:
- 新建一个监控脚本,比如
check_my_script.sh,内容如下(记得替换成你的脚本路径和名称):
#!/bin/bash # 要监控的Python脚本名称(或者进程关键词) TARGET_SCRIPT="your_serial_script.py" # 脚本的绝对路径 SCRIPT_PATH="/home/pi/projects/$TARGET_SCRIPT" # 检查进程是否存在 if ! pgrep -f "$TARGET_SCRIPT" > /dev/null; then # 进程不存在,重启脚本并记录日志 echo "$(date '+%Y-%m-%d %H:%M:%S'): 脚本已停止,正在重启..." >> /home/pi/script_restart.log python3 "$SCRIPT_PATH" & fi
- 给脚本添加执行权限:
chmod +x /home/pi/check_my_script.sh
- 用
crontab设置定时检查,比如每3分钟检查一次:
打开crontab编辑界面:
crontab -e
添加一行:
*/3 * * * * /home/pi/check_my_script.sh
保存退出后,crontab就会自动定时执行监控脚本了。
方案2:Systemd服务(推荐,最稳定)
Systemd是树莓派系统自带的服务管理工具,专门用来管理长期运行的服务,支持自动重启、开机自启,稳定性拉满:
- 新建一个Systemd服务文件,比如
/etc/systemd/system/serial_script.service:
[Unit] Description=24/7 Serial Communication Python Script After=network.target # 确保网络启动后再运行脚本 [Service] User=pi # 用pi用户运行,避免权限问题 ExecStart=/usr/bin/python3 /home/pi/projects/your_serial_script.py # 脚本的绝对路径 Restart=always # 不管什么原因退出都自动重启 RestartSec=5 # 崩溃后等待5秒再重启 # 记录日志,方便排查问题 StandardOutput=append:/home/pi/script_output.log StandardError=append:/home/pi/script_error.log [Install] WantedBy=multi-user.target # 多用户模式下开机自启
- 重新加载Systemd配置,启动服务并设置开机自启:
sudo systemctl daemon-reload sudo systemctl start serial_script.service sudo systemctl enable serial_script.service
- 可以随时查看服务状态或日志:
# 查看服务运行状态 sudo systemctl status serial_script.service # 查看最新日志 journalctl -u serial_script.service -f
方案3:Supervisor进程管理工具(功能丰富)
Supervisor是专门的进程监控工具,除了自动重启,还能方便地查看日志、手动启停进程,适合需要更多管控功能的场景:
- 安装Supervisor:
sudo apt update && sudo apt install supervisor
- 新建Supervisor配置文件,比如
/etc/supervisor/conf.d/serial_script.conf:
[program:serial_script] command=/usr/bin/python3 /home/pi/projects/your_serial_script.py # 启动命令 directory=/home/pi/projects/ # 脚本所在目录 user=pi # 运行用户 autostart=true # 开机自动启动 autorestart=true # 崩溃自动重启 startretries=3 # 启动失败重试3次 stdout_logfile=/home/pi/script_stdout.log # 标准输出日志 stderr_logfile=/home/pi/script_stderr.log # 错误日志
- 重启Supervisor使配置生效:
sudo systemctl restart supervisor
- 常用操作:
# 查看进程状态 sudo supervisorctl status serial_script # 手动重启进程 sudo supervisorctl restart serial_script # 查看所有受监控的进程 sudo supervisorctl status
额外建议
- 尽量在Python脚本内部添加异常捕获:比如对串口通信、网络请求的代码加
try-except块,把错误信息写入日志,能减少不必要的崩溃,也方便排查问题。 - 日志一定要重视:不管用哪种方案,开启日志后,出现问题时能快速定位崩溃原因,而不是只知道脚本重启了。
- 用绝对路径:所有脚本、文件的路径都用绝对路径,避免因为工作目录变化导致找不到文件的问题。
内容的提问来源于stack exchange,提问作者jawad didouh




