Files
hzdyjs/backend/start-all.sh
T
2025-08-08 20:35:17 +08:00

93 lines
3.3 KiB
Bash
Executable File

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