lawless/scripts/wait-for-it.sh

74 行
1.1 KiB
Bash

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