93 lines
3.3 KiB
Bash
Executable File
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" "$@"
|