Ver código fonte

feat(systemd): 添加双摄像头抓拍系统的systemd服务及安装脚本

- 创建dual-camera.service定义服务启动参数和资源限制
- 编写install-service.sh脚本,实现服务的安装与卸载功能
- 编写start.sh启动脚本,配置环境变量并启动主程序
- 支持服务自动重启、日志记录和优雅停止机制
- 提供方便的服务管理命令和用户交互提示
wenhongquan 1 dia atrás
pai
commit
1910e31e52

+ 35 - 0
dual_camera_system/scripts/dual-camera.service

@@ -0,0 +1,35 @@
+[Unit]
+Description=Dual Camera Capture System - 双摄像头联动抓拍系统
+Documentation=https://github.com/example/dual-camera-system
+After=network.target network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+User=admin
+Group=admin
+WorkingDirectory=/home/admin/dsh/dual_camera_system
+
+# 使用启动脚本
+ExecStart=/home/admin/dsh/dual_camera_system/scripts/start.sh
+
+# 重启策略
+Restart=on-failure
+RestartSec=10
+
+# 资源限制
+LimitNOFILE=65536
+LimitNPROC=4096
+
+# 日志
+StandardOutput=journal
+StandardError=journal
+SyslogIdentifier=dual-camera
+
+# 优雅退出
+TimeoutStopSec=30
+KillSignal=SIGINT
+KillMode=process
+
+[Install]
+WantedBy=multi-user.target

+ 135 - 0
dual_camera_system/scripts/install-service.sh

@@ -0,0 +1,135 @@
+#!/bin/bash
+#
+# 双摄像头联动抓拍系统 - 服务安装脚本
+# 
+# 使用方法:
+#   sudo ./install-service.sh        # 安装并启用服务
+#   sudo ./install-service.sh remove # 移除服务
+#
+
+set -e
+
+# 配置
+SERVICE_NAME="dual-camera"
+SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+# 颜色输出
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+print_info() {
+    echo -e "${GREEN}[INFO]${NC} $1"
+}
+
+print_warn() {
+    echo -e "${YELLOW}[WARN]${NC} $1"
+}
+
+print_error() {
+    echo -e "${RED}[ERROR]${NC} $1"
+}
+
+# 检查 root 权限
+check_root() {
+    if [[ $EUID -ne 0 ]]; then
+        print_error "此脚本需要 root 权限,请使用 sudo 运行"
+        exit 1
+    fi
+}
+
+# 安装服务
+install_service() {
+    print_info "开始安装 ${SERVICE_NAME} 服务..."
+    
+    # 检查服务文件是否存在
+    if [[ -f "${SERVICE_FILE}" ]]; then
+        print_warn "服务文件已存在,先停止并禁用旧服务..."
+        systemctl stop ${SERVICE_NAME} 2>/dev/null || true
+        systemctl disable ${SERVICE_NAME} 2>/dev/null || true
+    fi
+    
+    # 复制服务文件
+    print_info "复制服务文件到 ${SERVICE_FILE}..."
+    cp "${SCRIPT_DIR}/dual-camera.service" "${SERVICE_FILE}"
+    
+    # 设置权限
+    chmod 644 "${SERVICE_FILE}"
+    
+    # 重载 systemd
+    print_info "重载 systemd 配置..."
+    systemctl daemon-reload
+    
+    # 启用服务
+    print_info "启用开机自启动..."
+    systemctl enable ${SERVICE_NAME}
+    
+    print_info "服务安装完成!"
+    echo ""
+    echo "常用命令:"
+    echo "  启动服务:   sudo systemctl start ${SERVICE_NAME}"
+    echo "  停止服务:   sudo systemctl stop ${SERVICE_NAME}"
+    echo "  重启服务:   sudo systemctl restart ${SERVICE_NAME}"
+    echo "  查看状态:   sudo systemctl status ${SERVICE_NAME}"
+    echo "  查看日志:   sudo journalctl -u ${SERVICE_NAME} -f"
+    echo ""
+    
+    read -p "是否立即启动服务?[y/N] " -n 1 -r
+    echo
+    if [[ $REPLY =~ ^[Yy]$ ]]; then
+        print_info "启动服务..."
+        systemctl start ${SERVICE_NAME}
+        sleep 2
+        systemctl status ${SERVICE_NAME} --no-pager || true
+    fi
+}
+
+# 移除服务
+remove_service() {
+    print_info "开始移除 ${SERVICE_NAME} 服务..."
+    
+    # 停止服务
+    print_info "停止服务..."
+    systemctl stop ${SERVICE_NAME} 2>/dev/null || true
+    
+    # 禁用服务
+    print_info "禁用开机自启动..."
+    systemctl disable ${SERVICE_NAME} 2>/dev/null || true
+    
+    # 删除服务文件
+    if [[ -f "${SERVICE_FILE}" ]]; then
+        print_info "删除服务文件..."
+        rm -f "${SERVICE_FILE}"
+    fi
+    
+    # 重载 systemd
+    print_info "重载 systemd 配置..."
+    systemctl daemon-reload
+    
+    print_info "服务已移除!"
+}
+
+# 主函数
+main() {
+    case "${1:-install}" in
+        install)
+            check_root
+            install_service
+            ;;
+        remove|uninstall)
+            check_root
+            remove_service
+            ;;
+        *)
+            echo "用法: $0 [install|remove]"
+            echo ""
+            echo "  install  - 安装并启用服务(默认)"
+            echo "  remove   - 停止并移除服务"
+            exit 1
+            ;;
+    esac
+}
+
+main "$@"

+ 62 - 0
dual_camera_system/scripts/start.sh

@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# 双摄像头联动抓拍系统 - 启动脚本
+# 用于 systemd 服务或手动启动
+#
+
+set -e
+
+# ============================================================
+# 配置区域 - 根据实际环境修改
+# ============================================================
+
+# 项目路径
+PROJECT_DIR="/home/admin/dsh/dual_camera_system"
+
+# Conda 环境名称
+CONDA_ENV="rknn"
+
+# Conda 安装路径(根据实际情况修改)
+CONDA_PATH="/home/admin/miniconda3"
+
+# SDK 库路径
+SDK_LIB_PATH="/home/admin/dsh/dh/arm/Bin"
+
+# 日志文件路径
+LOG_DIR="/home/admin/dsh/logs"
+LOG_FILE="${LOG_DIR}/dual-camera.log"
+
+# 启动参数
+START_ARGS="--skip-calibration"  # 可添加其他参数,如 --multi-group
+
+# ============================================================
+# 环境设置
+# ============================================================
+
+# 创建日志目录
+mkdir -p "${LOG_DIR}"
+
+# 设置环境变量
+export PATH="${CONDA_PATH}/envs/${CONDA_ENV}/bin:${PATH}"
+export LD_LIBRARY_PATH="${SDK_LIB_PATH}:${LD_LIBRARY_PATH:-}"
+export OPENCV_FFMPEG_CAPTURE_OPTIONS="threads;1"
+
+# 切换到项目目录
+cd "${PROJECT_DIR}"
+
+# ============================================================
+# 启动系统
+# ============================================================
+
+echo "=========================================="
+echo "双摄像头联动抓拍系统"
+echo "=========================================="
+echo "项目路径: ${PROJECT_DIR}"
+echo "Conda环境: ${CONDA_ENV}"
+echo "启动参数: ${START_ARGS}"
+echo "日志文件: ${LOG_FILE}"
+echo "启动时间: $(date '+%Y-%m-%d %H:%M:%S')"
+echo "=========================================="
+
+# 启动主程序
+exec python main.py ${START_ARGS} 2>&1 | tee -a "${LOG_FILE}"