Как повторно вызывать 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.