How to create a loop in bash that is waiting for a webserver to respond?

Bash

Bash Problem Overview


How to create a loop in bash that is waiting for a webserver to respond?

It should print a "." every 10 seconds or so, and wait until the server starts to respond.

Update, this code tests if I get a good response from the server.

if curl --output /dev/null --silent --head --fail "$url"; then
echo "URL exists: $url"
else
echo "URL does not exist: $url"
fi

Bash Solutions


Solution 1 - Bash

Combining the question with chepner's answer, this worked for me:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    printf '.'
    sleep 5
done

Solution 2 - Bash

I wanted to limit the maximum number of attempts. Based on Thomas's accepted answer I made this:

attempt_counter=0
max_attempts=5

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
    if [ ${attempt_counter} -eq ${max_attempts} ];then
      echo "Max attempts reached"
      exit 1
    fi

    printf '.'
    attempt_counter=$(($attempt_counter+1))
    sleep 5
done

Solution 3 - Bash

httping is nice for this. simple, clean, quiet.

while ! httping -qc1 http://myhost:myport ; do sleep 1 ; done

while/until etc is a personal pref.

Solution 4 - Bash

The poster asks a specific question about printing ., but I think most people coming here are looking for the solution below, as it is a single command that supports finite retries.

curl --head -X GET --retry 5 --retry-connrefused --retry-delay 1 http://myhost:myport

Solution 5 - Bash

The use of backticks ` ` is outdated.

Use $( ) instead:

until $(curl --output /dev/null --silent --head --fail http://myhost:myport); do
  printf '.'
  sleep 5
done

Solution 6 - Bash

You can also combine timeout and tcp commands like this. It will timeout after 60s instead of waiting indefinitely

timeout 60 bash -c 'until echo > /dev/tcp/myhost/myport; do sleep 5; done'

Solution 7 - Bash

printf "Waiting for $HOST:$PORT"
until nc -z $HOST $PORT 2>/dev/null; do
    printf '.'
    sleep 10
done
echo "up!"

I took the idea from here: https://stackoverflow.com/a/34358304/1121497

Solution 8 - Bash

Interesting puzzle. If you have no access or async api with your client, you can try grepping your tcp sockets like this:

until grep '***IPV4 ADDRESS OF SERVER IN REVERSE HEX***' /proc/net/tcp
do
  printf '.'
  sleep 1
done

But that's a busy wait with 1 sec intervals. You probably want more resolution than that. Also this is global. If another connection is made to that server, your results are invalid.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsorinView Question on Stackoverflow
Solution 1 - BashThomas Ferris NicolaisenView Answer on Stackoverflow
Solution 2 - BashillagrenanView Answer on Stackoverflow
Solution 3 - BashBruce EdgeView Answer on Stackoverflow
Solution 4 - BashtwinlakesView Answer on Stackoverflow
Solution 5 - BashSerge StroobandtView Answer on Stackoverflow
Solution 6 - BashManikandanView Answer on Stackoverflow
Solution 7 - BashFerran MaylinchView Answer on Stackoverflow
Solution 8 - BashBoeroBoyView Answer on Stackoverflow