Я хотел бы создать цикл, который повторяет передачу 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