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


27

Я намагаюся синхронізувати файли з віддаленого сервера, який не є надійним, тобто з'єднання має тенденцію вийти з ладу "випадковим чином" з

rsync: з'єднання несподівано закрите

Rsync викликається з --partial, тому я хотів би мати можливість викликати rsync в циклі, поки файли не будуть повністю передані. Здається, не існує прапора, щоб сказати rsync повторити спробу.

Який був би найкращий спосіб його сценарію? Баш для петлі?


1
Хоча відповіді нижче корисні, може бути кращою ідеєю з’ясувати, чому це не вдається, і змусити його зупинитися. Я припускаю, що ви керуєте сервером, клієнтом і мережею між ними, тож ви можете запустити tcpdump в різних місцях, щоб побачити, як це було закрито. Можливо, один із пристроїв вашого брандмауера чи VPN закриває з'єднання?
MarkR

Сервер, до якого підключається, - це спільний хост, тому я не маю доступу до нього. Я можу розібратися, чому він закривається, але наразі я більш ніж радий просто спробувати його. Все одно дякую за голову вгору
Бруно Лопес

Я був шокований, коли 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.