diff --git a/wait-for-it.sh b/wait-for-it.sh index d990e0d..63d6f7f 100755 --- a/wait-for-it.sh +++ b/wait-for-it.sh @@ -13,6 +13,10 @@ Usage: -h HOST | --host=HOST Host or IP under test -p PORT | --port=PORT TCP port under test Alternatively, you specify the host and port as host:port + -c COMMAND | --command=COMMAND + A single command to test + -i TIMEOUT | --interval=TIMEOUT + Wait / sleep time interval between each test attempt -s | --strict Only execute subcommand if the test succeeds -q | --quiet Don't output any status messages -t TIMEOUT | --timeout=TIMEOUT @@ -32,19 +36,28 @@ wait_for() WAITFORIT_start_ts=$(date +%s) while : do - if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then - nc -z $WAITFORIT_HOST $WAITFORIT_PORT + if [[ $WAITFORIT_COMMAND != "" ]]; then + echoerr "Testing command $WAITFORIT_COMMAND" + $WAITFORIT_COMMAND WAITFORIT_result=$? else - (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 - WAITFORIT_result=$? + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + echoerr "Testing on busybox against $WAITFORIT_HOST/$WAITFORIT_PORT" + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + echoerr "Testing against $WAITFORIT_HOST/$WAITFORIT_PORT" + (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi fi if [[ $WAITFORIT_result -eq 0 ]]; then WAITFORIT_end_ts=$(date +%s) echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" break fi - sleep 1 + sleep $WAITFORIT_SLEEP_TIME + echoerr "Sleeping for $WAITFORIT_SLEEP_TIME" done return $WAITFORIT_result } @@ -53,9 +66,9 @@ wait_for_wrapper() { # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 if [[ $WAITFORIT_QUIET -eq 1 ]]; then - timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --command=$WAITFORIT_COMMAND --timeout=$WAITFORIT_TIMEOUT & else - timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --command=$WAITFORIT_COMMAND --timeout=$WAITFORIT_TIMEOUT & fi WAITFORIT_PID=$! trap "kill -INT -$WAITFORIT_PID" INT @@ -81,6 +94,24 @@ do WAITFORIT_CHILD=1 shift 1 ;; + -c) + WAITFORIT_COMMAND="$2" + if [[ $WAITFORIT_COMMAND == "" ]]; then break; fi + shift 2 + ;; + --command=*) + WAITFORIT_COMMAND="${1#*=}" + shift 1 + ;; + -i) + WAITFORIT_SLEEP_TIME="$2" + if [[ $WAITFORIT_SLEEP_TIME == "" ]]; then break; fi + shift 2 + ;; + --interval=*) + WAITFORIT_SLEEP_TIME="${1#*=}" + shift 1 + ;; -q | --quiet) WAITFORIT_QUIET=1 shift 1 @@ -131,8 +162,8 @@ do esac done -if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then - echoerr "Error: you need to provide a host and port to test." +if [[ ("$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "") && "$WAITFORIT_COMMAND" == "" ]]; then + echoerr "Error: you need to provide a host and port, or a single command to test." usage fi