Как повторно вызывать rsync, пока файлы не будут успешно переданы

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

rsync: соединение неожиданно закрыто

Rsync вызывается с --partial, поэтому я хотел бы иметь возможность вызывать rsync в цикле до полной передачи файлов. Похоже, нет флага, который бы сказал rsync повторить попытку.

Каков был бы лучший способ написать это? Баш за петлю?

4 ответа

Решение

Если вы синхронизируете все за одну синхронизацию, вызывайте rsync в цикле, пока rsync не выдаст вам успешный код возврата.

Что-то вроде:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

Это зациклится, вызывая rsync, пока не получит код возврата 0. Возможно, вы захотите добавить туда спящий режим, чтобы избежать DOSing вашего сервера.

Я столкнулся с этой же проблемой некоторое время назад. В конце я написал что-то похожее на ответ Дэвида, но немного обдумал его с помощью максимальных попыток, отвечая на Ctrl-C, и так далее: http://blog.iangreenleaf.com/2009/03/rsync-and-retrying-until-we-get-it.html.

Все это вместе с sshpass

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done

Просто еще один вариант — простой один лайнер, который будет работать бесконечно, пока не будет достигнут успех, с задержкой в ​​1 секунду после сбоя.

      while true; do rsync -avz --info=progress2 --partial src/ dsr/ && break || sleep 1; done

А ниже небольшая модификация, ограничивающая 10 неудач.

      for i in {0..10}; do rsync -avz --info=progress2 --partial src/ dsr/ && break || sleep 1; done
Другие вопросы по тегам