Ubuntu 22.04环境下Python/Bash程序异常退出自动重启最佳实践咨询
工业场景程序自动重启最佳实践
一、用systemd服务(Ubuntu官方推荐,最稳定)
替代Cron做开机自启,同时自带进程监控+自动重启能力,比脚本循环更可靠。
操作步骤:
- 创建服务配置文件:
/etc/systemd/system/industrial-app.service
[Unit] Description=工业场景Python应用监控 After=multi-user.target network.target nvidia-persistenced.service # 依赖Nvidia持久化服务,降低GPU驱动崩溃概率 Wants=nvidia-persistenced.service [Service] Type=simple # 替换成你的程序启动脚本路径 ExecStart=/home/your-user/run-app.sh # 任意情况退出都自动重启 Restart=always # 重启间隔,避免短时间内频繁重启 RestartSec=3 # 用非root用户运行,减少权限风险 User=your-user # 程序工作目录 WorkingDirectory=/home/your-user/app-dir # 日志输出到系统日志,方便排查问题 StandardOutput=journal+console StandardError=journal+console [Install] WantedBy=multi-user.target
- 配置Nvidia GPU持久化:
sudo systemctl enable --now nvidia-persistenced
这个服务能维持GPU驱动状态,减少因驱动异常导致的程序崩溃。
- 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable --now industrial-app.service
- 查看状态与日志:
# 检查服务运行状态 sudo systemctl status industrial-app.service # 实时查看程序日志 journalctl -u industrial-app.service -f
Balluff相机适配:
- 在启动脚本
run-app.sh开头添加mvImpact库的环境变量:
export LD_LIBRARY_PATH=/opt/mvImpact/lib/x64:$LD_LIBRARY_PATH
- 可选:在服务的
[Service]段加启动前检测,确保相机可用:
ExecStartPre=/opt/mvImpact/tools/check-camera-connection.sh
二、Bash脚本循环监控(轻量备选)
如果不想用systemd,直接在现有启动脚本里加循环逻辑:
示例run-app.sh:
#!/bin/bash # 配置环境变量 export LD_LIBRARY_PATH=/opt/mvImpact/lib/x64:$LD_LIBRARY_PATH export CUDA_VISIBLE_DEVICES=0 # 循环重启逻辑 reboot_count=0 max_reboots=15 # 避免无限重启 while [ $reboot_count -lt $max_reboots ]; do echo "[$(date)] 启动工业应用..." # 运行你的Python程序 python3.12 /home/your-user/app-dir/main.py exit_code=$? echo "[$(date)] 应用退出,码值:$exit_code。5秒后重启..." reboot_count=$((reboot_count+1)) sleep 5 done echo "[$(date)] 达到最大重启次数,停止尝试。"
然后保留Cron开机自启:
@reboot /home/your-user/run-app.sh >> /var/log/industrial-app.log 2>&1
注意:这种方式无法处理kill -9强制终止的情况,systemd可以覆盖这类场景。
三、Python内部监控(进阶自定义)
如果需要在Python层面做更灵活的状态检测(比如相机/GPU预检查),可以用主进程监控业务进程:
示例代码片段:
import subprocess import time import sys def start_core_app(): # 启动核心业务进程 return subprocess.Popen([sys.executable, "/home/your-user/app-dir/core.py"]) if __name__ == "__main__": reboot_count = 0 max_reboots = 10 while reboot_count < max_reboots: print(f"[{time.ctime()}] 启动核心应用...") proc = start_core_app() proc.wait() print(f"[{time.ctime()}] 核心应用退出,码值:{proc.returncode}。3秒后重启...") reboot_count += 1 time.sleep(3) print(f"[{time.ctime()}] 达到最大重启次数,停止。")
关键注意事项
- 日志必加:不管用哪种方案,都要记录详细日志(退出码、时间、硬件状态),方便定位相机/GPU的根本问题。
- 资源清理:程序崩溃可能残留相机句柄或GPU内存,重启前可以加清理步骤:
- 相机:调用mvImpact API释放资源,或用官方工具重置相机
- GPU:执行
nvidia-smi --gpu-reset(需root权限,谨慎使用)
- 权限配置:确保运行用户有相机和GPU访问权限:
sudo usermod -aG video your-user sudo usermod -aG render your-user
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

