74 行
1.1 KiB
Bash
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
|