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

Ubuntu 22.04环境下Python/Bash程序异常退出自动重启最佳实践咨询

工业场景程序自动重启最佳实践

一、用systemd服务(Ubuntu官方推荐,最稳定)

替代Cron做开机自启,同时自带进程监控+自动重启能力,比脚本循环更可靠。

操作步骤:

  1. 创建服务配置文件:/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
  1. 配置Nvidia GPU持久化:
sudo systemctl enable --now nvidia-persistenced

这个服务能维持GPU驱动状态,减少因驱动异常导致的程序崩溃。

  1. 启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable --now industrial-app.service
  1. 查看状态与日志:
# 检查服务运行状态
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:52:34