Skip to content
Snippets Groups Projects
retry 769 B
#!/bin/sh
set -eu

alias red="printf '\e[1;91m%s\e[0m\n'"
usage () {
    echo "$(basename "$0"): RETRIES COMMAND [ARG1 [ARG2 [...]]]"
    exit 1
}

if [ "$#" -lt 2 ] || [ "$1" -lt 1 ]
then
    usage
fi

retries="$1"
shift

for _ in $(seq "$retries")
do
    "$@" || status="$?"
    if [ "${status:-0}" -eq 0 ]
    then
        break
    elif [ "$_" -eq "$retries" ]
    then
        red "${1} failed too many times." >&2
        exit "$status"
    else
        case "$_" in
            1) duration=5;;
            2) duration=15;;
            3) duration=30;;
            4) duration=60;;
            5) duration=120;;
            *) duration=300;;
        esac
        red "${1} failed, going to retry in ${duration} seconds." >&2
        sleep "$duration"
    fi
done