Wait until a TCP port accepts connections
Bash
#!/usr/bin/env bash
# Wait until a TCP host:port accepts connections before starting.
set -euo pipefail
host="${1:-127.0.0.1}"
port="${2:-5432}"
timeout_s="${3:-30}"
# Bash's /dev/tcp redirection avoids extra tools like nc.
port_open() {
(exec 3<>"/dev/tcp/$host/$port") 2>/dev/null
}
deadline=$((SECONDS + timeout_s))
until port_open; do
if ((SECONDS >= deadline)); then
printf 'timed out after %ss waiting for %s:%s\n' \
"$timeout_s" "$host" "$port" >&2
exit 1
fi
sleep 1
done
printf '%s:%s ready after %ss\n' "$host" "$port" "$SECONDS"