Назад | Перейти на главную страницу

bash скрипт: повторите команду, если она вернет ошибку

Я хотел бы создать цикл, который повторяет передачу ncftp, если он возвращает ошибку.

Я немного не уверен, как можно использовать переменную кода выхода в цикле. Хотелось бы, чтобы это сработало?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done

Я нашел основу для этого элегантного цикла в другом месте на serverfault. Оказывается, нет необходимости сохранять код выхода, так как вы можете протестировать непосредственно в самой команде;

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

Почти. Вероятно, вам лучше сохранить возвращаемое значение как переменную, чтобы вы могли предварительно установить его перед циклом. В противном случае на него повлияет команда последнего запуска.

Вы также можете повязать sleep там, чтобы остановить его слишком быстрое возрождение.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

Немного хакерский, но мое решение состояло в том, чтобы просто создать функцию bash, которая запускается сама по себе, если выходит с ошибкой

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

Вы можете выполнить цикл, пока ваша команда возвращает ошибку:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

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

retry ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file

В этом случае команда ncftpput будет повторяться бесконечно до тех пор, пока она не вернет код состояния успеха, с откатом по умолчанию на десять секунд между ними.

Повторить попытку можно здесь: https://github.com/minfrin/retry