Skip to content

Instantly share code, notes, and snippets.

@rgl
Last active March 7, 2024 17:08
Show Gist options
  • Save rgl/f90ff293d56dbb0a1e0f7e7e89a81f42 to your computer and use it in GitHub Desktop.
Save rgl/f90ff293d56dbb0a1e0f7e7e89a81f42 to your computer and use it in GitHub Desktop.
Wait for an HTTP endpoint to return 200 OK with Bash and curl
bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:9000)" != "200" ]]; do sleep 5; done'
# also check https://gist.github.com/rgl/c2ba64b7e2a5a04d1eb65983995dce76
@wilk
Copy link

wilk commented Mar 14, 2019

timeout 300 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:9000)" != "200" ]]; do sleep 5; done' || false

version with 5 minutes of timeout: if timeout is reached, it exits with error (1)

@neonidian
Copy link

For TLS add --insecure flag for self signed certificates
timeout 300 bash -c 'while [[ "$(curl --insecure -s -o /dev/null -w ''%{http_code}'' https://localhost:9000)" != "200" ]]; do sleep 5; done'

@bukowa
Copy link

bukowa commented Jan 21, 2020

How to print status code before sleep?

@aaronArinder
Copy link

This is awesome--thanks!

@bukowa
Copy link

bukowa commented Jan 26, 2020

Edit: i think this is the best https://github.com/nev7n/wait_for_response

@snoby
Copy link

snoby commented May 4, 2020

Here a script with timeout

#!/bin/bash
set -eux

declare -r HOST="http://google.com"

wait-for-url() {
    echo "Testing $1"
    timeout -s TERM 45 bash -c \
    'while [[ "$(curl -s -o /dev/null -L -w ''%{http_code}'' ${0})" != "200" ]];\
    do echo "Waiting for ${0}" && sleep 2;\
    done' ${1}
    echo "OK!"
    curl -I $1
}
wait-for-url http://${HOST}

Testing http://localhost:8000
-bash: timeout: command not found
OK!
i don't think that the timeout command is on macOS

@cec
Copy link

cec commented Jul 3, 2020

Hi all,

I turned this into a script allowing for various of these behaviors to be configured via parameters.

I'm using it in our CI pipelines to make sure that APIs served by containers are alive before performing the next steps in the pipeline.

I'm very far from being a Bash expert and PR for improvements are very welcome.

Of course feel free the fork if you wish to :)

@wonderflow
Copy link

Thanks! Hope someone could make it to be a github action.

@phillbaker
Copy link

There is https://github.com/nev7n/wait_for_response, however, that doesn't support all the options available in curl.

@RogerRey14
Copy link

RogerRey14 commented Jun 9, 2021

Hi all,

Here a solution that worked to me. In my case I used it for an initContainer:

sh -c 'while (( curl -s -o /dev/null -w %{http_code} https://google.com/ != "200" && curl -s -o /dev/null -w %{http_code} https://google.com/ != "301")); do sleep 1; done;'

@eisenreich
Copy link

Thanks!
I forked your version and extended it to a script that can be used right away. We use it in the CI to wait for services until they are available.

https://gist.github.com/eisenreich/195ab1f05715ec86e300f75d007d711c

@bukowa
Copy link

bukowa commented Nov 1, 2022

There is https://github.com/nev7n/wait_for_response, however, that doesn't support all the options available in curl.

Thank you that looks neat

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment