Как автоматически запускать команду "curl" при возникновении ошибки

Иногда, когда я выполняю bash script с помощью команды curl для загрузки некоторых файлов на мой ftp-сервер, он возвращает некоторую ошибку, например:

56 response reading failed

и я должен найти неправильную строку и перезапустить их вручную, и все будет в порядке.

Мне интересно, может ли это быть повторно запущено автоматически при возникновении ошибки.


Мои сценарии таковы:

#there are some files(A,B,C,D,E) in my to_upload directory,
# which I'm trying to upload to my ftp server with curl command
for files in `ls` ;
    do curl -T $files ftp.myserver.com --user ID:pw ;
done

Но иногда A, B, C будут загружены успешно, только D осталось с "ошибкой 56", поэтому мне нужно повторно запустить команду curl вручную. Кроме того, как сказал Уилл Бикфорд, я предпочитаю, чтобы не было подтверждения, потому что я всегда сплю в то время, когда работает script.:)

Ответы

Ответ 1

Здесь bash фрагмент, который я использую для выполнения экспоненциального отступления:

# Retries a command a configurable number of times with backoff.
#
# The retry count is given by ATTEMPTS (default 5), the initial backoff
# timeout is given by TIMEOUT in seconds (default 1.)
#
# Successive backoffs double the timeout.
function with_backoff {
  local max_attempts=${ATTEMPTS-5}
  local timeout=${TIMEOUT-1}
  local attempt=0
  local exitCode=0

  while (( $attempt < $max_attempts ))
  do
    set +e
    "[email protected]"
    exitCode=$?
    set -e

    if [[ $exitCode == 0 ]]
    then
      break
    fi

    echo "Failure! Retrying in $timeout.." 1>&2
    sleep $timeout
    attempt=$(( attempt + 1 ))
    timeout=$(( timeout * 2 ))
  done

  if [[ $exitCode != 0 ]]
  then
    echo "You've failed me for the last time! ([email protected])" 1>&2
  fi

  return $exitCode
}

Затем используйте его в сочетании с любой командой, которая правильно устанавливает код выхода из строя:

with_backoff curl 'http://monkeyfeathers.example.com/'

Обратите внимание, что как отправлено with_backoff установит флаг bash "die on error" -e, который вы можете или не хотите (я хочу.) Удалите две строки set по желанию.

Ответ 2

Возможно, это поможет. Он попробует команду, и если она не удастся, она сообщит вам и сделает паузу, давая вам возможность исправить run-my-script.

COMMAND=./run-my-script.sh 
until $COMMAND; do 
    read -p "command failed, fix and hit enter to try again."
done