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

27

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

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

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

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

Бруно Лопес
источник
1
Хотя приведенные ниже ответы полезны, возможно, было бы лучше выяснить, почему это не помогло, и заставить его остановиться. Я предполагаю, что вы управляете сервером, клиентом и сетью между ними, поэтому вы можете запустить tcpdump в разных местах, чтобы увидеть, как он был закрыт. Возможно, одно из ваших брандмауэров или VPN-устройств закрывает соединение?
MarkR
Сервер, к которому он подключается, является общим хостом, поэтому у меня нет root-доступа к нему. Я мог бы выяснить, почему он закрывается, но сейчас я более чем счастлив просто повторить попытку. В любом случае, спасибо за хедз-ап
Бруно Лопес
Я был шокирован, обнаружив, что rsync фактически не имеет возможности повторить попытку!
Майкл
rsync --partial --append имеет возможность повторить попытку, вручную или в сценарии, проверяя код возврата. Дубликат: superuser.com/questions/302842/…
rickfoosusa

Ответы:

29

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

Что-то типа:

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

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

Дэвид
источник
28
ты можешь просто написать пока! rsync -a ....; спать 5; готово
Джастин
1
просто будьте осторожны, как вы используете это, например, если вы попытаетесь запустить его через cron, то вы можете столкнуться с проблемами параллелизма.
Кейран Холлоуэй
3
Это превратится в бесконечный цикл, если есть непереходная ошибка (например, ошибка разрешения чтения или записи файлов). Я бы порекомендовал проверить состояние выхода rsync на наличие определенных сетевых ошибок, что-то вроде RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](или любых других состояний выхода, которые вы видите из-за сбоя сети).
Гордон Дэвиссон
1
Поскольку я не управляю этим (полностью) без присмотра, бесконечные циклы и параллелизм не являются большой проблемой, спасибо.
Бруно Лопес
2
Жаль, что rsync не имеет этой встроенной функции, потому что любой цикл на основе оболочки будет запрашивать пароль в тех случаях, когда автоматическая аутентификация недоступна или не подходит.
Майкл
1

все это вместе с 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
Инструментарий
источник