#!/bin/bash # delay starting after 2 failed runs delay_after=2 # reset delay counter after 60 seconds delay_reset_after=60 # delay for 30 seconds delay=30 times_ran=0 cleanup() { if [[ -n "$pid" ]]; then echo "killed... $pid" >&2 kill "$pid" fi exit } trap cleanup 2 15 while :; do case $1 in --delay) if [[ ! $2 ]]; then echo "Missing argument to --delay" >&2 exit 1 fi delay=$2 shift 2 continue ;; --reset-after) if [[ ! $2 ]]; then echo "Missing argument to --reset-after" >&2 exit 1 fi delay_reset_after=$2 shift 2 continue ;; --delay-after) if [[ ! $2 ]]; then echo "Missing argument to --delay-after" >&2 exit 1 fi delay_after=$2 shift 2 continue ;; --help|-h) echo "usage: ${0##*/} [options] [--] " echo '' echo 'Options:' echo ' --help, -h this help' echo ' --delay amount of delay after enoguh failed runs' echo ' --delay-after amount of runs after which we wait' echo ' --reset-after reset the failed counter after this time' exit 0 ;; --) shift break ;; *) break ;; esac shift done command=("$@") while :; do times_ran=$((times_ran+1)) if [[ $times_ran -gt $delay_after ]]; then echo "sleeping for $delay seconds after $((times_ran-1)) runs in $delay_reset_after seconds" >&2 sleep "$delay" fi time_started=$(date +%s) echo -n "running... " >&2 "${command[@]}" & pid=$! echo PID: $pid >&2 wait $pid pid="" # reset counter if run long enough if [[ $((time_started+delay_reset_after)) -lt $(date +%s) ]]; then times_ran=0 fi done