#!/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