#!/bin/bash # ============================================= # LJ360 全景监控服务管理脚本 - 增强版 # 基于步骤化提示、彩色输出、友好交互 # 适用于 RK3588 / Linux 本地或远程管理 # ============================================= # --------------------------------------------- # 初始化设置 # --------------------------------------------- # 遇到错误立即退出 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' PURPLE='\033[0;35m' NC='\033[0m' # No Color # 进度与状态打印函数 print_header() { clear echo -e "${PURPLE}" echo "╔══════════════════════════════════════════════════════╗" echo "║ LJ360 全景监控服务管理工具 (增强版) ║" echo "║ RK3588 / Linux ║" echo "╚══════════════════════════════════════════════════════╝" echo -e "${NC}" } print_step() { echo -e "${BLUE}[STEP $1/$2]${NC} $3" } print_success() { echo -e "${GREEN}✓${NC} $1" } print_warning() { echo -e "${YELLOW}⚠${NC} $1" } print_error() { echo -e "${RED}✗${NC} $1" } print_progress() { echo -e "${CYAN}[进度]${NC} $1" } print_divider() { echo -e "${BLUE}──────────────────────────────────────────────${NC}" } # --------------------------------------------- # 全局配置 # --------------------------------------------- TOTAL_STEPS=9 STEP=1 SERVICE_NAME="lj360.service" WATCHDOG_SERVICE="lj360_watchdog.service" # 获取当前用户 CURRENT_USER=$(whoami) # 检查是否以 root 运行 if [ "$EUID" -eq 0 ]; then print_error "❌ 请勿使用 root 用户运行此脚本。" print_error "✅ 请使用以下命令运行(普通用户):" print_error " bash $0" exit 1 fi # 项目目录 PROJECT_DIR="/home/$CURRENT_USER/LJ360" print_header print_success "🔧 当前用户: $CURRENT_USER" print_success "📂 项目目录: $PROJECT_DIR" echo "" # --------------------------------------------- # 主菜单逻辑与步骤化功能 # --------------------------------------------- main_menu() { while true; do show_status echo -e "${CYAN}🔧 请选择要执行的操作:${NC}" print_divider echo "1) 🛠️ 安装 LJ360 全景监控服务" echo "2) 🛡️ 安装并启动看门狗服务" echo "3) ▶️ 启动全景监控服务" echo "4) ⏹️ 停止全景监控服务" echo "5) 🔄 重启全景监控服务" echo "6) 🔔 启用开机自启" echo "7) 🚫 禁用开机自启" echo "8) 📜 查看实时日志" echo "9) 📊 查看系统状态" echo "10) 🧹 卸载 LJ360 服务" echo "0) 🚪 退出脚本" print_divider read -p "👉 请输入选项 [0-10]: " choice case $choice in 1) STEP=1 install_service ;; 2) STEP=1 install_watchdog_service ;; 3) STEP=1 start_service ;; 4) STEP=1 stop_service ;; 5) STEP=1 restart_service ;; 6) STEP=1 enable_service ;; 7) STEP=1 disable_service ;; 8) STEP=1 view_logs ;; 9) STEP=1 view_status ;; 10) STEP=1 uninstall_service ;; 0) print_success "👋 再见!脚本已退出。" exit 0 ;; *) print_error "❌ 无效选项,请重新输入 [0-10]" sleep 2 ;; esac done } # --------------------------------------------- # 功能函数 # --------------------------------------------- show_status() { print_header echo -e "${BLUE}【📊 当前服务状态】${NC}" print_divider # 检查主服务状态 if systemctl is-active --quiet $SERVICE_NAME 2>/dev/null; then echo -e "${GREEN}● LJ360 服务正在运行 ✅${NC}" else echo -e "${RED}● LJ360 服务未运行 ❌${NC}" fi # 检查看门狗服务状态 if systemctl is-active --quiet $WATCHDOG_SERVICE 2>/dev/null; then echo -e "${GREEN}● 看门狗服务正在运行 🛡️${NC}" else echo -e "${YELLOW}● 看门狗服务未运行 ⚠${NC}" fi # 检查开机自启状态 if systemctl is-enabled $SERVICE_NAME 2>/dev/null; then echo -e "${GREEN}● 开机自启已启用 ✅${NC}" else echo -e "${YELLOW}● 开机自启未启用 ⚠${NC}" fi # 检查Web端口 echo "" echo -e "${BLUE}【🌐 网络端口状态】${NC}" print_divider if netstat -tlnp 2>/dev/null | grep -q ":5000"; then echo -e "${GREEN}● Web 服务端口 5000 已监听 ✅${NC}" else echo -e "${RED}● Web 服务端口 5000 未监听 ❌${NC}" fi echo "" } # -------------------------- # Step 1: 安装服务 # -------------------------- install_service() { print_step $STEP $TOTAL_STEPS "安装 LJ360 全景监控服务" # 检查项目目录是否存在 if [ ! -d "$PROJECT_DIR" ]; then print_error "❌ 项目目录不存在: $PROJECT_DIR" print_error "请确认项目路径是否正确" read -p "🔘 按 Enter 继续..." -r return fi # 检查web.py文件是否存在 if [ ! -f "$PROJECT_DIR/web.py" ]; then print_error "❌ web.py 文件不存在: $PROJECT_DIR/web.py" print_error "请确认项目文件是否正确" read -p "🔘 按 Enter 继续..." -r return fi # 创建启动脚本 local START_SCRIPT="$PROJECT_DIR/start_lj360.sh" print_progress "🔧 创建启动脚本: $START_SCRIPT" cat > "$START_SCRIPT" << EOF #!/bin/bash # LJ360 全景监控启动脚本 # 项目目录: $PROJECT_DIR # 切换到项目目录 cd "$PROJECT_DIR" # 设置环境变量 export DISPLAY=:0 export XAUTHORITY=/home/$CURRENT_USER/.Xauthority export PYTHONPATH=$PROJECT_DIR:\$PYTHONPATH # 日志文件 LOG_FILE="$PROJECT_DIR/lj360.log" ERROR_LOG="$PROJECT_DIR/lj360_error.log" echo "=========================================" >> "\$LOG_FILE" echo "LJ360 启动时间: \$(date)" >> "\$LOG_FILE" echo "=========================================" >> "\$LOG_FILE" # 检查是否已有进程在运行 if pgrep -f "python3 web.py" > /dev/null; then echo "\$(date): LJ360 应用已在运行,跳过启动" >> "\$LOG_FILE" exit 0 fi # 启动应用并记录输出 echo "\$(date): 启动 LJ360 web.py..." >> "\$LOG_FILE" exec python3 web.py >> "\$LOG_FILE" 2>> "\$ERROR_LOG" EOF chmod +x "$START_SCRIPT" chown "$CURRENT_USER:$CURRENT_USER" "$START_SCRIPT" print_success "✅ 启动脚本已创建并授权" # 创建 systemd 服务 print_progress "🔧 创建 systemd 服务文件: /etc/systemd/system/$SERVICE_NAME" sudo tee /etc/systemd/system/$SERVICE_NAME > /dev/null << EOF [Unit] Description=LJ360 Surround View Service After=network.target graphical.target Wants=network.target graphical.target [Service] Type=simple User=$CURRENT_USER WorkingDirectory=$PROJECT_DIR Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/$CURRENT_USER/.Xauthority" Environment="PYTHONPATH=$PROJECT_DIR" Environment="XDG_RUNTIME_DIR=/run/user/1000" ExecStart=$PROJECT_DIR/start_lj360.sh Restart=always RestartSec=5 StandardOutput=journal StandardError=journal # 限制资源使用(可选) # MemoryMax=1G # CPUQuota=80% [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload print_success "✅ systemd 服务文件已部署 & 缓存已刷新" STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 2: 安装看门狗服务 # -------------------------- install_watchdog_service() { print_step $STEP $TOTAL_STEPS "安装并启动看门狗服务" # 创建看门狗脚本 local WATCHDOG_SCRIPT="$PROJECT_DIR/watchdog_lj360.sh" print_progress "🔧 创建看门狗脚本: $WATCHDOG_SCRIPT" cat > "$WATCHDOG_SCRIPT" << EOF #!/bin/bash # LJ360 看门狗服务脚本 # 项目目录: $PROJECT_DIR APP_NAME="web.py" CHECK_INTERVAL=10 LOG_FILE="$PROJECT_DIR/watchdog.log" echo "=========================================" >> "\$LOG_FILE" echo "看门狗服务启动时间: \$(date)" >> "\$LOG_FILE" echo "=========================================" >> "\$LOG_FILE" while true; do # 检查主服务进程是否存在 if ! pgrep -f "python3 \$APP_NAME" > /dev/null; then echo "\$(date): 检测到 LJ360 未运行,正在启动..." >> "\$LOG_FILE" cd "$PROJECT_DIR" # 设置环境变量 export DISPLAY=:0 export XAUTHORITY=/home/$CURRENT_USER/.Xauthority export PYTHONPATH=$PROJECT_DIR:\$PYTHONPATH # 启动应用 nohup python3 web.py >> "$PROJECT_DIR/lj360.log" 2>> "$PROJECT_DIR/lj360_error.log" & echo "\$(date): 已启动 LJ360,PID: \$!" >> "\$LOG_FILE" # 等待应用启动 sleep 5 fi sleep \$CHECK_INTERVAL done EOF chmod +x "$WATCHDOG_SCRIPT" chown "$CURRENT_USER:$CURRENT_USER" "$WATCHDOG_SCRIPT" print_success "✅ 看门狗脚本已创建并授权" # 创建看门狗 systemd 服务 print_progress "🔧 创建看门狗服务文件: /etc/systemd/system/$WATCHDOG_SERVICE" sudo tee /etc/systemd/system/$WATCHDOG_SERVICE > /dev/null << EOF [Unit] Description=LJ360 Watchdog Service After=network.target Wants=network.target [Service] Type=simple User=$CURRENT_USER WorkingDirectory=$PROJECT_DIR ExecStart=$PROJECT_DIR/watchdog_lj360.sh Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload print_success "✅ 看门狗服务文件已部署" # 启用并启动看门狗服务 print_progress "🚀 启动看门狗服务" sudo systemctl enable $WATCHDOG_SERVICE sudo systemctl start $WATCHDOG_SERVICE sleep 2 if systemctl is-active --quiet $WATCHDOG_SERVICE; then print_success "✅ 看门狗服务启动成功" else print_warning "⚠️ 看门狗服务启动可能有问题,请查看日志" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 3: 启动服务 # -------------------------- start_service() { print_step $STEP $TOTAL_STEPS "启动 LJ360 全景监控服务" # 检查服务文件是否存在 if [ ! -f "/etc/systemd/system/$SERVICE_NAME" ]; then print_error "❌ 服务未安装,请先安装服务" read -p "🔘 按 Enter 继续..." -r return fi print_progress "🚀 正在启动服务: $SERVICE_NAME" sudo systemctl start "$SERVICE_NAME" sleep 3 # 检查启动状态 if systemctl is-active --quiet "$SERVICE_NAME"; then print_success "✅ 服务启动成功" # 检查Web端口 sleep 2 if netstat -tlnp 2>/dev/null | grep -q ":5000"; then local IP_ADDR=$(hostname -I | awk '{print $1}') print_success "🌐 Web 服务已启动: http://$IP_ADDR:5000" print_success "🌐 本地访问: http://localhost:5000" fi else print_warning "⚠️ 服务启动可能有问题,请查看日志" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 4: 停止服务 # -------------------------- stop_service() { print_step $STEP $TOTAL_STEPS "停止 LJ360 全景监控服务" # 检查服务文件是否存在 if [ ! -f "/etc/systemd/system/$SERVICE_NAME" ]; then print_error "❌ 服务未安装,请先安装服务" read -p "🔘 按 Enter 继续..." -r return fi print_progress "⏹️ 正在停止服务: $SERVICE_NAME" sudo systemctl stop "$SERVICE_NAME" sleep 2 # 清理可能的残留进程 print_progress "🧹 清理残留进程..." pkill -f "python3 web.py" 2>/dev/null || true # 检查停止状态 if ! systemctl is-active --quiet "$SERVICE_NAME"; then print_success "✅ 服务停止成功" else print_warning "⚠️ 服务停止可能有问题" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 5: 重启服务 # -------------------------- restart_service() { print_step $STEP $TOTAL_STEPS "重启 LJ360 全景监控服务" # 检查服务文件是否存在 if [ ! -f "/etc/systemd/system/$SERVICE_NAME" ]; then print_error "❌ 服务未安装,请先安装服务" read -p "🔘 按 Enter 继续..." -r return fi print_progress "🔄 正在重启服务: $SERVICE_NAME" sudo systemctl restart "$SERVICE_NAME" sleep 3 # 检查重启状态 if systemctl is-active --quiet "$SERVICE_NAME"; then print_success "✅ 服务重启成功" # 检查Web端口 sleep 2 if netstat -tlnp 2>/dev/null | grep -q ":5000"; then local IP_ADDR=$(hostname -I | awk '{print $1}') print_success "🌐 Web 服务已重启: http://$IP_ADDR:5000" fi else print_warning "⚠️ 服务重启可能有问题,请查看日志" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 6: 启用开机自启 # -------------------------- enable_service() { print_step $STEP $TOTAL_STEPS "启用开机自启" # 检查服务文件是否存在 if [ ! -f "/etc/systemd/system/$SERVICE_NAME" ]; then print_error "❌ 服务未安装,请先安装服务" read -p "🔘 按 Enter 继续..." -r return fi print_progress "🔔 正在启用开机自启: $SERVICE_NAME" sudo systemctl enable "$SERVICE_NAME" sleep 1 if systemctl is-enabled "$SERVICE_NAME"; then print_success "✅ 开机自启已启用" else print_error "❌ 开机自启启用失败" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 7: 禁用开机自启 # -------------------------- disable_service() { print_step $STEP $TOTAL_STEPS "禁用开机自启" # 检查服务文件是否存在 if [ ! -f "/etc/systemd/system/$SERVICE_NAME" ]; then print_error "❌ 服务未安装,请先安装服务" read -p "🔘 按 Enter 继续..." -r return fi print_progress "🚫 正在禁用开机自启: $SERVICE_NAME" sudo systemctl disable "$SERVICE_NAME" sleep 1 if ! systemctl is-enabled "$SERVICE_NAME"; then print_success "✅ 开机自启已禁用" else print_error "❌ 开机自启禁用失败" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 8: 查看日志 # -------------------------- view_logs() { print_step $STEP $TOTAL_STEPS "查看实时日志" # 检查服务文件是否存在 if [ ! -f "/etc/systemd/system/$SERVICE_NAME" ]; then print_error "❌ 服务未安装,请先安装服务" read -p "🔘 按 Enter 继续..." -r return fi print_progress "📜 请选择要查看的日志类型:" echo "1) 📋 查看 systemd 服务日志" echo "2) 📄 查看应用日志文件" echo "3) ⚠️ 查看错误日志文件" echo "4) 🛡️ 查看看门狗日志" print_divider read -p "👉 请选择 [1-4]: " log_choice case $log_choice in 1) print_progress "📜 正在打开 systemd 服务日志(按 Ctrl+C 退出)" echo "" sudo journalctl -u "$SERVICE_NAME" -f ;; 2) print_progress "📄 正在查看应用日志文件: $PROJECT_DIR/lj360.log" echo "" if [ -f "$PROJECT_DIR/lj360.log" ]; then tail -50 "$PROJECT_DIR/lj360.log" echo "" echo "按 Enter 查看更多,或按 Ctrl+C 退出..." tail -f "$PROJECT_DIR/lj360.log" else print_error "❌ 日志文件不存在" fi ;; 3) print_progress "⚠️ 正在查看错误日志文件: $PROJECT_DIR/lj360_error.log" echo "" if [ -f "$PROJECT_DIR/lj360_error.log" ]; then tail -50 "$PROJECT_DIR/lj360_error.log" else print_warning "⚠️ 错误日志文件不存在" fi ;; 4) print_progress "🛡️ 正在查看看门狗日志文件: $PROJECT_DIR/watchdog.log" echo "" if [ -f "$PROJECT_DIR/watchdog.log" ]; then tail -50 "$PROJECT_DIR/watchdog.log" else print_warning "⚠️ 看门狗日志文件不存在" fi ;; *) print_error "❌ 无效选项" ;; esac STEP=$((STEP + 1)) read -p "🔘 日志查看结束,按 Enter 继续..." -r } # -------------------------- # Step 9: 查看系统状态 # -------------------------- view_status() { print_step $STEP $TOTAL_STEPS "查看详细系统状态" echo -e "${CYAN}【📊 系统资源状态】${NC}" print_divider # CPU使用率 echo -e "${BLUE}● CPU 使用率:${NC}" top -bn1 | grep "Cpu(s)" | awk '{print " " $2 "% user, " $4 "% system, " $8 "% idle"}' # 内存使用 echo -e "${BLUE}● 内存使用:${NC}" free -h | awk '/^Mem:/ {print " " $3 " / " $2 " (" $3/$2*100 "%) used"}' # 磁盘空间 echo -e "${BLUE}● 磁盘空间:${NC}" df -h /home | awk 'NR==2 {print " " $3 " / " $2 " (" $5 ") used"}' echo "" echo -e "${CYAN}【🔍 进程状态】${NC}" print_divider # LJ360相关进程 if pgrep -f "python3 web.py" > /dev/null; then echo -e "${GREEN}● LJ360 进程正在运行 ✅${NC}" ps aux | grep "python3 web.py" | grep -v grep | awk '{print " PID: " $2 ", CPU: " $3 "%, MEM: " $4 "%, CMD: " $11}' else echo -e "${RED}● LJ360 进程未运行 ❌${NC}" fi echo "" echo -e "${CYAN}【📈 服务运行时间】${NC}" print_divider if systemctl is-active --quiet $SERVICE_NAME; then UPTIME=$(systemctl show $SERVICE_NAME --property=ActiveEnterTimestamp | awk -F= '{print $2}') echo -e "${GREEN}● 服务启动时间: $UPTIME${NC}" fi if systemctl is-active --quiet $WATCHDOG_SERVICE; then WATCHDOG_UPTIME=$(systemctl show $WATCHDOG_SERVICE --property=ActiveEnterTimestamp | awk -F= '{print $2}') echo -e "${GREEN}● 看门狗启动时间: $WATCHDOG_UPTIME${NC}" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # -------------------------- # Step 10: 卸载服务 # -------------------------- uninstall_service() { print_step $STEP $TOTAL_STEPS "卸载 LJ360 全景监控服务" echo -e "${RED}⚠ 警告:此操作将卸载 LJ360 全景监控服务!${NC}" echo -n "✅ 确定要卸载吗?(y/N): " read -r confirm if [[ $confirm =~ ^[Yy]$ ]]; then print_progress "⏹️ 停止服务..." sudo systemctl stop "$SERVICE_NAME" 2>/dev/null || true sudo systemctl stop "$WATCHDOG_SERVICE" 2>/dev/null || true print_progress "🚫 禁用开机自启..." sudo systemctl disable "$SERVICE_NAME" 2>/dev/null || true sudo systemctl disable "$WATCHDOG_SERVICE" 2>/dev/null || true print_progress "🗑️ 删除 systemd 服务文件..." sudo rm -f /etc/systemd/system/"$SERVICE_NAME" sudo rm -f /etc/systemd/system/"$WATCHDOG_SERVICE" sudo systemctl daemon-reload sudo systemctl reset-failed print_progress "🗑️ 删除启动脚本..." rm -f "$PROJECT_DIR/start_lj360.sh" rm -f "$PROJECT_DIR/watchdog_lj360.sh" print_progress "🔪 清理进程..." pkill -f "python3 web.py" 2>/dev/null || true pkill -f "watchdog_lj360.sh" 2>/dev/null || true print_success "✅ LJ360 全景监控服务卸载完成" print_warning "📝 日志文件保留在: $PROJECT_DIR/" print_warning " - lj360.log" print_warning " - lj360_error.log" print_warning " - watchdog.log" else print_warning "❌ 取消卸载操作" fi STEP=$((STEP + 1)) read -p "🔘 按 Enter 继续..." -r } # --------------------------------------------- # 启动主菜单 # --------------------------------------------- # 检查是否在正确的目录运行 if [ ! -d "$PROJECT_DIR" ]; then print_error "❌ 项目目录不存在: $PROJECT_DIR" print_error "请确认项目路径是否正确,或者修改脚本中的 PROJECT_DIR 变量" exit 1 fi main_menu