There are many cases in which you may wish to retry a failed command a certain number of times. Examples are database failures, network communication failures or file IO problems.
The snippet below shows a simple method of retrying commands in bash:
#!/bin/bash MAX_ATTEMPTS=5 attempt_num=1 until command || (( attempt_num == MAX_ATTEMPTS )) do echo "Attempt $attempt_num failed! Trying again in $attempt_num seconds..." sleep $(( attempt_num++ )) done
In this example, the command
is attempted a maximum of five times and the interval between attempts is increased incrementally whenever the command fails. The time between the first and second attempt is 1 second, that between the second and third is 2 seconds and so on. If you want, you can change this to a constant interval or random exponential backoff instead.
I have created a useful retry
function (shown below) which allows me to retry commands from different places in my script without duplicating the retry logic. This function returns a non-zero exit code when all attempts have been exhausted.
#!/bin/bash # Retries a command on failure. # $1 - the max number of attempts # $2... - the command to run retry() { local -r -i max_attempts="$1"; shift local -r cmd="$@" local -i attempt_num=1 until $cmd do if (( attempt_num == max_attempts )) then echo "Attempt $attempt_num failed and there are no more attempts left!" return 1 else echo "Attempt $attempt_num failed! Trying again in $attempt_num seconds..." sleep $(( attempt_num++ )) fi done } # example usage: retry 5 ls -ltr foo
Related Posts:
Executing a Shell Command with a Timeout
Retrying Operations in Java
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.