start-backend.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #!/bin/bash
  2. # ==========================================
  3. # 后端服务启动脚本
  4. # 功能:按顺序启动后端服务的各个组件
  5. # 作者:Cursor AI 辅助
  6. # 时间:2025-01-12
  7. # 使用:chmod +x start-backend.sh && ./start-backend.sh
  8. # ==========================================
  9. # 脚本配置
  10. SCRIPT_NAME="start-backend.sh"
  11. LOG_DIR="logs"
  12. LOG_FILE="$LOG_DIR/backend-startup-$(date +%Y%m%d-%H%M%S).log"
  13. BACKEND_DIR="backend"
  14. # 颜色定义
  15. RED='\033[0;31m'
  16. GREEN='\033[0;32m'
  17. YELLOW='\033[1;33m'
  18. BLUE='\033[0;34m'
  19. NC='\033[0m' # No Color
  20. # 创建日志目录
  21. mkdir -p "$LOG_DIR"
  22. # 日志函数
  23. log_info() {
  24. local message="$1"
  25. local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
  26. echo -e "${GREEN}[INFO]${NC} $message"
  27. echo "[$timestamp] [INFO] $message" >> "$LOG_FILE"
  28. }
  29. log_warn() {
  30. local message="$1"
  31. local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
  32. echo -e "${YELLOW}[WARN]${NC} $message"
  33. echo "[$timestamp] [WARN] $message" >> "$LOG_FILE"
  34. }
  35. log_error() {
  36. local message="$1"
  37. local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
  38. echo -e "${RED}[ERROR]${NC} $message"
  39. echo "[$timestamp] [ERROR] $message" >> "$LOG_FILE"
  40. }
  41. log_step() {
  42. local step="$1"
  43. local message="$2"
  44. local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
  45. echo -e "${BLUE}[STEP $step]${NC} $message"
  46. echo "[$timestamp] [STEP $step] $message" >> "$LOG_FILE"
  47. }
  48. # 执行命令并检查结果
  49. execute_command() {
  50. local step="$1"
  51. local command="$2"
  52. local description="$3"
  53. local work_dir="$4"
  54. log_step "$step" "开始执行: $description"
  55. log_info "命令: $command"
  56. # 切换到指定目录(如果提供)
  57. if [ -n "$work_dir" ]; then
  58. if [ ! -d "$work_dir" ]; then
  59. log_error "目录不存在: $work_dir"
  60. return 1
  61. fi
  62. log_info "切换到目录: $work_dir"
  63. cd "$work_dir" || {
  64. log_error "无法切换到目录: $work_dir"
  65. return 1
  66. }
  67. fi
  68. # 执行命令并捕获输出
  69. local start_time=$(date +%s)
  70. log_info "开始执行命令..."
  71. # 将命令输出同时写入日志文件和控制台
  72. if eval "$command" 2>&1 | tee -a "$LOG_FILE"; then
  73. local end_time=$(date +%s)
  74. local duration=$((end_time - start_time))
  75. log_info "✅ $description 执行成功 (耗时: ${duration}秒)"
  76. return 0
  77. else
  78. local end_time=$(date +%s)
  79. local duration=$((end_time - start_time))
  80. local exit_code=${PIPESTATUS[0]}
  81. log_error "❌ $description 执行失败 (错误码: $exit_code, 耗时: ${duration}秒)"
  82. log_error "命令: $command"
  83. log_error "工作目录: $(pwd)"
  84. return 1
  85. fi
  86. }
  87. # 清理函数
  88. cleanup() {
  89. log_info "脚本执行结束,返回原始目录"
  90. cd "$(dirname "$0")" || true
  91. }
  92. # 设置错误处理
  93. trap cleanup EXIT
  94. # 脚本开始
  95. log_info "========================================"
  96. log_info "后端服务启动脚本开始执行"
  97. log_info "脚本名称: $SCRIPT_NAME"
  98. log_info "日志文件: $LOG_FILE"
  99. log_info "开始时间: $(date '+%Y-%m-%d %H:%M:%S')"
  100. log_info "========================================"
  101. # 保存原始目录
  102. ORIGINAL_DIR=$(pwd)
  103. log_info "原始目录: $ORIGINAL_DIR"
  104. # 检查backend目录是否存在
  105. if [ ! -d "$BACKEND_DIR" ]; then
  106. log_error "backend目录不存在: $BACKEND_DIR"
  107. log_error "请确保在项目根目录下执行此脚本"
  108. exit 1
  109. fi
  110. # Step 1: 清理项目
  111. if ! execute_command "1" "mvn clean" "Maven清理项目" "$BACKEND_DIR"; then
  112. log_error "Maven清理失败,停止执行"
  113. exit 1
  114. fi
  115. # 返回原始目录
  116. cd "$ORIGINAL_DIR"
  117. # Step 2: 编译安装项目
  118. if ! execute_command "2" "mvn install" "Maven编译安装项目" "$BACKEND_DIR"; then
  119. log_error "Maven编译安装失败,停止执行"
  120. exit 1
  121. fi
  122. # 返回原始目录
  123. cd "$ORIGINAL_DIR"
  124. # Step 3: 启动监控服务
  125. if ! execute_command "3" "./start-monitor.sh" "启动监控服务" "$BACKEND_DIR"; then
  126. log_error "启动监控服务失败,停止执行"
  127. exit 1
  128. fi
  129. # 返回原始目录
  130. cd "$ORIGINAL_DIR"
  131. # Step 4: 启动任务调度服务
  132. if ! execute_command "4" "./start-job.sh" "启动任务调度服务" "$BACKEND_DIR"; then
  133. log_error "启动任务调度服务失败,停止执行"
  134. exit 1
  135. fi
  136. # 返回原始目录
  137. cd "$ORIGINAL_DIR"
  138. # Step 5: 热启动主服务
  139. if ! execute_command "5" "./hot-start.sh" "热启动主服务" "$BACKEND_DIR"; then
  140. log_error "热启动主服务失败,停止执行"
  141. exit 1
  142. fi
  143. # 返回原始目录
  144. cd "$ORIGINAL_DIR"
  145. # 脚本成功完成
  146. log_info "========================================"
  147. log_info "🎉 后端服务启动脚本执行完成!"
  148. log_info "所有服务已成功启动:"
  149. log_info " ✅ Maven项目清理和编译"
  150. log_info " ✅ 监控服务 (start-monitor.sh)"
  151. log_info " ✅ 任务调度服务 (start-job.sh)"
  152. log_info " ✅ 主服务热启动 (hot-start.sh)"
  153. log_info "结束时间: $(date '+%Y-%m-%d %H:%M:%S')"
  154. log_info "日志文件: $LOG_FILE"
  155. log_info "========================================"
  156. exit 0