как автоматически перезапустить команду "curl" при возникновении ошибки - PullRequest
16 голосов
/ 02 декабря 2011

Иногда, когда я выполняю bash-скрипт с командой 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 вручную. Кроме того, как сказал Уилл Бикфорд, я предпочитаю, чтобы подтверждение не требовалось, потому что я всегда сплю во время работы сценария. :)

Ответы [ 2 ]

40 голосов
/ 02 декабря 2011

Вот фрагмент кода 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=1
  local exitCode=0

  while (( $attempt < $max_attempts ))
  do
    if "$@"
    then
      return 0
    else
      exitCode=$?
    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! ($@)" 1>&2
  fi

  return $exitCode
}

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

with_backoff curl 'http://monkeyfeathers.example.com/'
6 голосов
/ 02 декабря 2011

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

COMMAND=./run-my-script.sh 
until $COMMAND; do 
    read -p "command failed, fix and hit enter to try again."
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...