#!/bin/bash # ========================================== # 后端服务启动脚本 # 功能:按顺序启动后端服务的各个组件 # 作者:Cursor AI 辅助 # 时间:2025-01-12 # 使用:chmod +x start-backend.sh && ./start-backend.sh # ========================================== # 脚本配置 SCRIPT_NAME="start-backend.sh" LOG_DIR="logs" LOG_FILE="$LOG_DIR/backend-startup-$(date +%Y%m%d-%H%M%S).log" BACKEND_DIR="backend" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 创建日志目录 mkdir -p "$LOG_DIR" # 日志函数 log_info() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo -e "${GREEN}[INFO]${NC} $message" echo "[$timestamp] [INFO] $message" >> "$LOG_FILE" } log_warn() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo -e "${YELLOW}[WARN]${NC} $message" echo "[$timestamp] [WARN] $message" >> "$LOG_FILE" } log_error() { local message="$1" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo -e "${RED}[ERROR]${NC} $message" echo "[$timestamp] [ERROR] $message" >> "$LOG_FILE" } log_step() { local step="$1" local message="$2" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') echo -e "${BLUE}[STEP $step]${NC} $message" echo "[$timestamp] [STEP $step] $message" >> "$LOG_FILE" } # 执行命令并检查结果 execute_command() { local step="$1" local command="$2" local description="$3" local work_dir="$4" log_step "$step" "开始执行: $description" log_info "命令: $command" # 切换到指定目录(如果提供) if [ -n "$work_dir" ]; then if [ ! -d "$work_dir" ]; then log_error "目录不存在: $work_dir" return 1 fi log_info "切换到目录: $work_dir" cd "$work_dir" || { log_error "无法切换到目录: $work_dir" return 1 } fi # 执行命令并捕获输出 local start_time=$(date +%s) log_info "开始执行命令..." # 将命令输出同时写入日志文件和控制台 if eval "$command" 2>&1 | tee -a "$LOG_FILE"; then local end_time=$(date +%s) local duration=$((end_time - start_time)) log_info "✅ $description 执行成功 (耗时: ${duration}秒)" return 0 else local end_time=$(date +%s) local duration=$((end_time - start_time)) local exit_code=${PIPESTATUS[0]} log_error "❌ $description 执行失败 (错误码: $exit_code, 耗时: ${duration}秒)" log_error "命令: $command" log_error "工作目录: $(pwd)" return 1 fi } # 清理函数 cleanup() { log_info "脚本执行结束,返回原始目录" cd "$(dirname "$0")" || true } # 设置错误处理 trap cleanup EXIT # 脚本开始 log_info "========================================" log_info "后端服务启动脚本开始执行" log_info "脚本名称: $SCRIPT_NAME" log_info "日志文件: $LOG_FILE" log_info "开始时间: $(date '+%Y-%m-%d %H:%M:%S')" log_info "========================================" # 保存原始目录 ORIGINAL_DIR=$(pwd) log_info "原始目录: $ORIGINAL_DIR" # 检查backend目录是否存在 if [ ! -d "$BACKEND_DIR" ]; then log_error "backend目录不存在: $BACKEND_DIR" log_error "请确保在项目根目录下执行此脚本" exit 1 fi # Step 1: 清理项目 if ! execute_command "1" "mvn clean" "Maven清理项目" "$BACKEND_DIR"; then log_error "Maven清理失败,停止执行" exit 1 fi # 返回原始目录 cd "$ORIGINAL_DIR" # Step 2: 编译安装项目 if ! execute_command "2" "mvn install" "Maven编译安装项目" "$BACKEND_DIR"; then log_error "Maven编译安装失败,停止执行" exit 1 fi # 返回原始目录 cd "$ORIGINAL_DIR" # Step 3: 启动监控服务 if ! execute_command "3" "./start-monitor.sh" "启动监控服务" "$BACKEND_DIR"; then log_error "启动监控服务失败,停止执行" exit 1 fi # 返回原始目录 cd "$ORIGINAL_DIR" # Step 4: 启动任务调度服务 if ! execute_command "4" "./start-job.sh" "启动任务调度服务" "$BACKEND_DIR"; then log_error "启动任务调度服务失败,停止执行" exit 1 fi # 返回原始目录 cd "$ORIGINAL_DIR" # Step 5: 热启动主服务 if ! execute_command "5" "./hot-start.sh" "热启动主服务" "$BACKEND_DIR"; then log_error "热启动主服务失败,停止执行" exit 1 fi # 返回原始目录 cd "$ORIGINAL_DIR" # 脚本成功完成 log_info "========================================" log_info "🎉 后端服务启动脚本执行完成!" log_info "所有服务已成功启动:" log_info " ✅ Maven项目清理和编译" log_info " ✅ 监控服务 (start-monitor.sh)" log_info " ✅ 任务调度服务 (start-job.sh)" log_info " ✅ 主服务热启动 (hot-start.sh)" log_info "结束时间: $(date '+%Y-%m-%d %H:%M:%S')" log_info "日志文件: $LOG_FILE" log_info "========================================" exit 0