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