| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #!/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" "$@"
|