start-all.sh 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/bin/bash
  2. # =============================================================================
  3. # 一键启动脚本 (顺序: 监控中心 → 定时任务 → 主业务)
  4. # 功能: 依次启动 start-monitor.sh、start-job.sh、hot-start.sh
  5. # 位置: backend/start-all.sh
  6. # 作者: zlwu
  7. # 时间: 2025-07-10
  8. # =============================================================================
  9. set -e
  10. # -------------- 编码设置 -----------------------------------------------------
  11. export LANG=zh_CN.UTF-8
  12. export LC_ALL=zh_CN.UTF-8
  13. # 确保 Java 与 Maven 进程使用 UTF-8 编码
  14. export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 $JAVA_TOOL_OPTIONS"
  15. export MAVEN_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 $MAVEN_OPTS"
  16. # -------------- 配置区 -------------------------------------------------------
  17. MONITOR_SCRIPT="./start-monitor.sh" # 监控中心启动脚本
  18. MONITOR_PORT=9090 # 监控中心端口
  19. JOB_SCRIPT="./start-job.sh" # 定时任务启动脚本
  20. JOB_PORT=8800 # 定时任务端口
  21. MAIN_SCRIPT="./hot-start.sh" # 主业务启动脚本
  22. # -------------- 辅助函数 -----------------------------------------------------
  23. COLOR_GREEN='\033[0;32m'
  24. COLOR_YELLOW='\033[1;33m'
  25. COLOR_RED='\033[0;31m'
  26. COLOR_CYAN='\033[0;36m'
  27. COLOR_RESET='\033[0m'
  28. # 等待端口就绪
  29. wait_for_port() {
  30. local port=$1
  31. local name=$2
  32. local retry=0
  33. local max_retry=60 # 最多等待 60 次 (约 120s)
  34. printf "${COLOR_CYAN}⏳ 正在等待 %s (端口 %s) 启动" "$name" "$port"
  35. while ! (command -v nc &>/dev/null && nc -z localhost "$port") 2>/dev/null; do
  36. # 若系统无 nc,则使用 lsof 检测
  37. if ! command -v nc &>/dev/null; then
  38. if lsof -Pi :"$port" -sTCP:LISTEN -t >/dev/null 2>&1; then
  39. break
  40. fi
  41. fi
  42. printf "."
  43. sleep 2
  44. retry=$((retry+1))
  45. if [ $retry -ge $max_retry ]; then
  46. printf "\n${COLOR_RED}❌ 等待 %s 启动超时 (端口 %s 未就绪)${COLOR_RESET}\n" "$name" "$port"
  47. exit 1
  48. fi
  49. done
  50. printf "\n${COLOR_GREEN}✅ %s 已启动${COLOR_RESET}\n" "$name"
  51. }
  52. # 启动脚本并后台运行
  53. start_in_background() {
  54. local script=$1
  55. local log_file=$2
  56. bash "$script" > "$log_file" 2>&1 &
  57. echo $!
  58. }
  59. # 捕获退出信号以清理后台进程
  60. cleanup() {
  61. echo -e "\n${COLOR_YELLOW}⚠️ 检测到退出信号,正在关闭后台服务...${COLOR_RESET}"
  62. [[ -n "$MONITOR_PID" ]] && kill "$MONITOR_PID" 2>/dev/null || true
  63. [[ -n "$JOB_PID" ]] && kill "$JOB_PID" 2>/dev/null || true
  64. exit 0
  65. }
  66. trap cleanup INT TERM
  67. # -------------- 启动流程 -----------------------------------------------------
  68. SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
  69. cd "$SCRIPT_DIR"
  70. # 1. 启动监控中心
  71. echo -e "${COLOR_GREEN}🚀 启动监控中心...${COLOR_RESET}"
  72. MONITOR_PID=$(start_in_background "$MONITOR_SCRIPT" "logs/monitor.log")
  73. wait_for_port "$MONITOR_PORT" "监控中心"
  74. # 2. 启动定时任务服务
  75. echo -e "${COLOR_GREEN}🚀 启动定时任务服务...${COLOR_RESET}"
  76. JOB_PID=$(start_in_background "$JOB_SCRIPT" "logs/job.log")
  77. wait_for_port "$JOB_PORT" "定时任务服务"
  78. # 3. 启动主业务 (前台运行,方便查看日志)
  79. echo -e "${COLOR_GREEN}🚀 启动主业务服务...${COLOR_RESET}"
  80. exec bash "$MAIN_SCRIPT" "$@"