#!/usr/bin/env bash # 简易 wait-for-it:等待 host:port 可达 # 用法:wait-for-it.sh host:port [-t timeout] [-- command args] set -euo pipefail HOST="" PORT="" TIMEOUT=30 STRICT=0 CLI=() usage() { echo "Usage: $0 host:port [-t timeout] [-- command args]" >&2 exit 1 } if [ $# -lt 1 ]; then usage fi HOST_PORT="$1" shift HOST="${HOST_PORT%:*}" PORT="${HOST_PORT##*:}" if [ -z "$HOST" ] || [ -z "$PORT" ] || ! [[ "$PORT" =~ ^[0-9]+$ ]]; then usage fi while [ $# -gt 0 ]; do case "$1" in -t|--timeout) TIMEOUT="$2" shift 2 ;; -s|--strict) STRICT=1 shift ;; --) shift CLI=("$@") break ;; *) usage ;; esac done wait_for() { local elapsed=0 while ! (exec 3<>"/dev/tcp/$HOST/$PORT") 2>/dev/null; do if [ "$elapsed" -ge "$TIMEOUT" ]; then echo "Timeout waiting for $HOST:$PORT after ${TIMEOUT}s" >&2 return 1 fi sleep 1 elapsed=$((elapsed + 1)) done return 0 } if wait_for; then if [ ${#CLI[@]} -gt 0 ]; then exec "${CLI[@]}" fi exit 0 else exit "$STRICT" fi