#!/bin/bash # ============================================================================= # 一键启动脚本 (顺序: 监控中心 → 定时任务 → 主业务) # 功能: 依次启动 start-monitor.sh、start-job.sh、hot-start.sh # 位置: backend/start-all.sh # 作者: zlwu # 时间: 2025-07-10 # ============================================================================= set -e # -------------- 编码设置 ----------------------------------------------------- export LANG=zh_CN.UTF-8 export LC_ALL=zh_CN.UTF-8 # 确保 Java 与 Maven 进程使用 UTF-8 编码 export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 $JAVA_TOOL_OPTIONS" export MAVEN_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 $MAVEN_OPTS" # -------------- 配置区 ------------------------------------------------------- MONITOR_SCRIPT="./start-monitor.sh" # 监控中心启动脚本 MONITOR_PORT=9090 # 监控中心端口 JOB_SCRIPT="./start-job.sh" # 定时任务启动脚本 JOB_PORT=8800 # 定时任务端口 MAIN_SCRIPT="./hot-start.sh" # 主业务启动脚本 # -------------- 辅助函数 ----------------------------------------------------- COLOR_GREEN='\033[0;32m' COLOR_YELLOW='\033[1;33m' COLOR_RED='\033[0;31m' COLOR_CYAN='\033[0;36m' COLOR_RESET='\033[0m' # 等待端口就绪 wait_for_port() { local port=$1 local name=$2 local retry=0 local max_retry=60 # 最多等待 60 次 (约 120s) printf "${COLOR_CYAN}⏳ 正在等待 %s (端口 %s) 启动" "$name" "$port" while ! (command -v nc &>/dev/null && nc -z localhost "$port") 2>/dev/null; do # 若系统无 nc,则使用 lsof 检测 if ! command -v nc &>/dev/null; then if lsof -Pi :"$port" -sTCP:LISTEN -t >/dev/null 2>&1; then break fi fi printf "." sleep 2 retry=$((retry+1)) if [ $retry -ge $max_retry ]; then printf "\n${COLOR_RED}❌ 等待 %s 启动超时 (端口 %s 未就绪)${COLOR_RESET}\n" "$name" "$port" exit 1 fi done printf "\n${COLOR_GREEN}✅ %s 已启动${COLOR_RESET}\n" "$name" } # 启动脚本并后台运行 start_in_background() { local script=$1 local log_file=$2 bash "$script" > "$log_file" 2>&1 & echo $! } # 捕获退出信号以清理后台进程 cleanup() { echo -e "\n${COLOR_YELLOW}⚠️ 检测到退出信号,正在关闭后台服务...${COLOR_RESET}" [[ -n "$MONITOR_PID" ]] && kill "$MONITOR_PID" 2>/dev/null || true [[ -n "$JOB_PID" ]] && kill "$JOB_PID" 2>/dev/null || true exit 0 } trap cleanup INT TERM # -------------- 启动流程 ----------------------------------------------------- SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) cd "$SCRIPT_DIR" # 1. 启动监控中心 echo -e "${COLOR_GREEN}🚀 启动监控中心...${COLOR_RESET}" MONITOR_PID=$(start_in_background "$MONITOR_SCRIPT" "logs/monitor.log") wait_for_port "$MONITOR_PORT" "监控中心" # 2. 启动定时任务服务 echo -e "${COLOR_GREEN}🚀 启动定时任务服务...${COLOR_RESET}" JOB_PID=$(start_in_background "$JOB_SCRIPT" "logs/job.log") wait_for_port "$JOB_PORT" "定时任务服务" # 3. 启动主业务 (前台运行,方便查看日志) echo -e "${COLOR_GREEN}🚀 启动主业务服务...${COLOR_RESET}" exec bash "$MAIN_SCRIPT" "$@"