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
|