I have a script I run to deploy two web services and a front-end application. The script calls a method that checks to see if the two back-end services are up and running. If so, deem the deploy successful, otherwise revert.
The two services sometimes take longer than the front-end to start up. Currently, I put in a sleep call to delay the web service check. This allows them time to start up.
I want to remove this sleep and add in a retry mechanism so that if a service is down, just retry the check repeatedly until I get a response.
To check if the device is up, I use curl. I've read that curl has a retry mechanism but I've never used it.
Have any of you solved this problem before? I want to understand the things I must consider when solving it, e.g. do I retry until I get an HTTP 200 response from my service?
Does anyone have any suggestions on how I'd test this? I'd need to find a service that was down.
EDIT: I see that -retry
only reacts to transient errors. "Transient error means either: a timeout, an FTP 4xx response code or an HTTP 5xx response code". My service can return a 404 therefore curl's retry is not my solution.
Best Answer
The following statement will retry 5 times or a maximum of 40 seconds with a connection timeout of 5 seconds, and no exponential backoff policy
curl --connect-timeout 5 \--max-time 10 \--retry 5 \--retry-delay 0 \--retry-max-time 40 \'http://your_url'--max-time 10 (how long each retry will wait)--retry 5 (it will retry 5 times)--retry-delay 0 (an exponential backoff algorithm)--retry-max-time (total time before it's considered failed)
Note that there is also a --retry-connrefused
(since curl 7.52.0) that retries even when the connection is refused and --retry-all-errors
(since curl 7.71.0) which "is the sledgehammer of retrying".
Just to clear up any possible confusion for anyone new...
Please see: https://curl.haxx.se/docs/manpage.html
--retry
If a transient error is returned when curl tries to perform atransfer, it will retry this number of times before giving up. Settingthe number to 0 makes curl do no retries (which is the default).Transient error means either: a timeout, an FTP 4xx response code oran HTTP 5xx response code.
When curl is about to retry a transfer, it will first wait one secondand then for all forthcoming retries it will double the waiting timeuntil it reaches 10 minutes which then will be the delay between therest of the retries. By using --retry-delay you disable thisexponential backoff algorithm. See also --retry-max-time to limit thetotal time allowed for retries.
If this option is used several times, the last one will be used.
Added in 7.12.3.
If you use --max-time 10
this will kill your connection before 10 seconds so its not useful when downloading.
Following will retry 300 times with 5sec delay and 30sec connection timeout
curl \--connect-timeout 30 \--retry 300 \--retry-delay 5 \URL