74 lines
1.6 KiB
Bash
74 lines
1.6 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
set -e
|
||
|
|
||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
#
|
||
|
# Copyright (C) 2022-2022 kcgen <kcgen@users.noreply.github.com>
|
||
|
|
||
|
usage()
|
||
|
{
|
||
|
printf "%s\n" "\
|
||
|
Usage: ATTEMPTS COMMAND [[ARG1] ARG2 ...]
|
||
|
Where:
|
||
|
ATTEMPTS : Retry the COMMAND up to this many times.
|
||
|
COMMAND : The executable or command to run.
|
||
|
ARG(s) : One or more arguments for the COMMAND.
|
||
|
|
||
|
Note: Place COMMAND or ARG(s) inside single or double
|
||
|
quotes if they contain spaces.
|
||
|
"
|
||
|
}
|
||
|
|
||
|
# Setup the error handler
|
||
|
error_code=1
|
||
|
fail() {
|
||
|
if [ "$error_code" -ne 0 ]; then
|
||
|
echo "$1" >&2
|
||
|
fi
|
||
|
exit "$error_code"
|
||
|
}
|
||
|
|
||
|
# Check number of arguments
|
||
|
if [ "$#" -lt 2 ]; then
|
||
|
usage
|
||
|
fail "Please provide both the number of ATTEMPTS and COMMAND to run."
|
||
|
fi
|
||
|
|
||
|
# Setup our current and total number of attempts
|
||
|
attempt=1
|
||
|
attempts="$1"
|
||
|
shift
|
||
|
case "$attempts" in
|
||
|
''|*[!0-9]*) usage; fail "$attempts is invalid, please provide a number 1 or greater" ;;
|
||
|
esac
|
||
|
if [ "$attempts" -lt 1 ]; then
|
||
|
usage
|
||
|
fail "$attempts cannot be a negative number, please provide a number 1 or greater"
|
||
|
fi
|
||
|
|
||
|
while true; do
|
||
|
# reset the error code
|
||
|
error_code=0
|
||
|
|
||
|
# Launch and capture the error code on failure
|
||
|
$* || error_code=$?
|
||
|
|
||
|
# Quit if it passed
|
||
|
if [ "$error_code" -eq 0 ]; then
|
||
|
break
|
||
|
fi
|
||
|
|
||
|
# Inform the user
|
||
|
echo -n "\"$*\" quit with error-code $error_code on attempt $attempt of $attempts, " >&2
|
||
|
|
||
|
# Maybe loop again or bail out
|
||
|
if [ "$attempt" -lt "$attempts" ]; then
|
||
|
attempt=$((attempt+1))
|
||
|
sleep 1
|
||
|
echo "retrying ...\n" >&2
|
||
|
else
|
||
|
fail "quitting.\n"
|
||
|
fi
|
||
|
done
|