Skip to content

Instantly share code, notes, and snippets.

@jimeh
Last active May 25, 2023 09:15
Show Gist options
  • Save jimeh/03019b4d7d0bbfccaa06997940c2d2b3 to your computer and use it in GitHub Desktop.
Save jimeh/03019b4d7d0bbfccaa06997940c2d2b3 to your computer and use it in GitHub Desktop.
wait-for.sh
#!/bin/sh
[ -n "$DEBUG" ] && set -x
check_http() {
wget -T 1 -S -q -O - "$1" 2>&1 | head -1 |
grep -E 'HTTP.+\s2[0-9]{2}' > /dev/null 2>&1
return $?
}
check_tcp() {
host="$(echo "$1" | cut -d: -f1)"
port="$(echo "$1" | cut -d: -f2)"
if [ -z "${host}" ] || [ -z "${port}" ]; then
echo "TCP target ${1} is not in \"<host>:<port>\" format" >&2
exit 2
fi
nc -z -w1 "$host" "$port" > /dev/null 2>&1
return $?
}
wait_for() {
type="$1"
uri="$2"
timeout="${3:-30}"
if [ "$type" = "tcp" ] && [ -z "$(which nc)" ]; then
echo "ERROR: nc command not available" >&2
exit 3
fi
if [ "$type" = "http" ] && [ -z "$(which wget)" ]; then
echo "ERROR: wget command not available" >&2
exit 3
fi
seconds=0
while [ "$seconds" -lt "$timeout" ] && ! "check_${type}" "$uri"; do
if [ "$seconds" -lt "1" ]; then
printf "Waiting for %s ." "$uri"
else
printf .
fi
seconds=$((seconds + 1))
sleep 1
done
if [ "$seconds" -lt "$timeout" ]; then
if [ "$seconds" -gt "0" ]; then
echo " up!"
fi
else
echo " FAIL"
echo "ERROR: unable to connect to: $uri" >&2
exit 1
fi
}
if [ -n "$WAIT_FOR_TARGETS" ]; then
uris="$(echo "$WAIT_FOR_TARGETS" | sed -e 's/\s+/\n/g' | uniq)"
for uri in $uris; do
if echo "$uri" | grep -E '^https?://.*' > /dev/null 2>&1; then
wait_for "http" "$uri" "$WAIT_FOR_TIMEOUT"
else
wait_for "tcp" "$uri" "$WAIT_FOR_TIMEOUT"
fi
done
fi
exec "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment