| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- #!/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
|