Как повторно вызывать 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