#!/bin/bash #set -x # 调试模式,可以启用以打印每行脚本的执行情况 # 设置默认的等待时间间隔,默认值为2秒 : "${SLEEP_SECOND:=2}" # 设置默认的超时时间,默认值为60秒 : "${TIMEOUT:=60}" # 带时间戳+emoji的小型日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" } # 等待服务函数 wait_for() { local host="$1" local port="$2" local timeout="$TIMEOUT" local start_time local current_time local elapsed_time local attempt=0 start_time=$(date +%s) log "🔄 开始等待依赖服务 $host:$port 可用 (超时时间: ${timeout}s, 间隔: ${SLEEP_SECOND}s)" while ! nc -z "$host" "$port" 2>/dev/null; do current_time=$(date +%s) elapsed_time=$((current_time - start_time)) attempt=$((attempt + 1)) if [ "$elapsed_time" -ge "$timeout" ]; then log "🛑 [ERROR] 等待超时!依赖服务 $host:$port 在 ${timeout}s 内未启动" return 1 fi log "🔄 第 ${attempt} 次检测:$host:$port 未就绪,已等待 ${elapsed_time}s..." sleep "$SLEEP_SECOND" done total_time=$(( $(date +%s) - start_time )) log "✅ [SUCCESS] 依赖服务 $host:$port 已启动,耗时 ${total_time}s" return 0 } # 声明变量 declare DEPENDS declare CMD # 解析参数 while getopts "d:c:" arg; do case "$arg" in d) DEPENDS="$OPTARG" ;; c) CMD="$OPTARG" ;; ?) log "🛑 [ERROR] 未知参数" exit 1 ;; esac done # 检查依赖 if [ -n "$DEPENDS" ]; then log "📦 检测到依赖服务列表: $DEPENDS" for var in ${DEPENDS//,/ }; do host=${var%:*} port=${var#*:} if [ -z "$host" ] || [ -z "$port" ]; then log "🛑 [ERROR] 依赖项格式错误: $var,应为 host:port" exit 1 fi if ! wait_for "$host" "$port"; then log "❌ [ERROR] 依赖服务 $host:$port 启动失败,终止执行" exit 1 fi done else log "⚡️ 未配置依赖服务,跳过依赖检测" fi # 执行命令 if [ -n "$CMD" ]; then log "🚀 准备执行命令: $CMD" eval "$CMD" cmd_exit_code=$? if [ $cmd_exit_code -eq 0 ]; then log "✅ [SUCCESS] 命令执行完成,退出码: $cmd_exit_code" else log "❌ [ERROR] 命令执行失败,退出码: $cmd_exit_code" exit $cmd_exit_code fi else log "⚠️ [WARNING] 未指定要执行的命令,脚本结束" fi