diff --git a/Documents/bin/retry b/Documents/bin/retry new file mode 100755 index 0000000000000000000000000000000000000000..8cc714cec8f84f6b69a457c7af07fb5fbd343475 --- /dev/null +++ b/Documents/bin/retry @@ -0,0 +1,40 @@ +#!/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