diff --git a/wait-for-it.sh b/wait-for-it.sh index eca6c3b..fff13c9 100755 --- a/wait-for-it.sh +++ b/wait-for-it.sh @@ -1,12 +1,19 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh # Use this script to test if a given TCP host/port are available -cmdname=$(basename $0) +set -e -echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } +cmdname=$(basename "$0") + +echoerr() { + if [ "$QUIET" -ne 1 ]; then + printf "%s\n" "$*" 1>&2; + fi +} usage() { + exitcode="$1" cat << USAGE >&2 Usage: $cmdname host:port [-s] [-t timeout] [-- command args] @@ -19,22 +26,22 @@ Usage: Timeout in seconds, zero for no timeout -- COMMAND ARGS Execute command with args after the test finishes USAGE - exit 1 + exit "$exitcode" } wait_for() { - if [[ $TIMEOUT -gt 0 ]]; then + if [ "$TIMEOUT" -gt 0 ]; then echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" else echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" fi start_ts=$(date +%s) - while : + while true do - (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 + nc -z "$HOST" "$PORT" >/dev/null 2>&1 result=$? - if [[ $result -eq 0 ]]; then + if [ $result -eq 0 ]; then end_ts=$(date +%s) echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" break @@ -47,29 +54,32 @@ wait_for() wait_for_wrapper() { # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 - if [[ $QUIET -eq 1 ]]; then - timeout $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + if [ "$QUIET" -eq 1 ]; then + timeout "$TIMEOUT" "$0" -q -child "$HOST":"$PORT" -t "$TIMEOUT" & else - timeout $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + timeout "$TIMEOUT" "$0" --child "$HOST":"$PORT" -t "$TIMEOUT" & fi PID=$! - trap "kill -INT -$PID" INT + trap 'kill -INT -$PID' INT wait $PID RESULT=$? - if [[ $RESULT -ne 0 ]]; then + if [ $RESULT -ne 0 ]; then echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" fi return $RESULT } +TIMEOUT=15 +STRICT=0 +CHILD=0 +QUIET=0 # process arguments -while [[ $# -gt 0 ]] +while [ $# -gt 0 ] do case "$1" in *:* ) - hostport=(${1//:/ }) - HOST=${hostport[0]} - PORT=${hostport[1]} + HOST=$(printf "%s\n" "$1"| cut -d : -f 1) + PORT=$(printf "%s\n" "$1"| cut -d : -f 2) shift 1 ;; --child) @@ -86,16 +96,16 @@ do ;; -h) HOST="$2" - if [[ $HOST == "" ]]; then break; fi + if [ "$HOST" = "" ]; then break; fi shift 2 ;; --host=*) - HOST="${1#*=}" + HOST=$(printf "%s" "$1" | cut -d = -f 2) shift 1 ;; -p) PORT="$2" - if [[ $PORT == "" ]]; then break; fi + if [ "$PORT" = "" ]; then break; fi shift 2 ;; --port=*) @@ -104,7 +114,7 @@ do ;; -t) TIMEOUT="$2" - if [[ $TIMEOUT == "" ]]; then break; fi + if [ "$TIMEOUT" = "" ]; then break; fi shift 2 ;; --timeout=*) @@ -113,35 +123,29 @@ do ;; --) shift - CLI="$@" break ;; --help) - usage + usage 0 ;; *) echoerr "Unknown argument: $1" - usage + usage 1 ;; esac done -if [[ "$HOST" == "" || "$PORT" == "" ]]; then +if [ "$HOST" = "" -o "$PORT" = "" ]; then echoerr "Error: you need to provide a host and port to test." - usage + usage 2 fi -TIMEOUT=${TIMEOUT:-15} -STRICT=${STRICT:-0} -CHILD=${CHILD:-0} -QUIET=${QUIET:-0} - -if [[ $CHILD -gt 0 ]]; then +if [ $CHILD -gt 0 ]; then wait_for RESULT=$? exit $RESULT else - if [[ $TIMEOUT -gt 0 ]]; then + if [ "$TIMEOUT" -gt 0 ]; then wait_for_wrapper RESULT=$? else @@ -150,12 +154,12 @@ else fi fi -if [[ $CLI != "" ]]; then - if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then +if [ "$*" != "" ]; then + if [ $RESULT -ne 0 -a $STRICT -eq 1 ]; then echoerr "$cmdname: strict mode, refusing to execute subprocess" exit $RESULT fi - exec $CLI + exec "$@" else exit $RESULT fi