Возобновить rsync через SSH после разрыва соединения?


45

Я должен передавать большие объемы данных (> 80 ГБ) через SSH с помощью rsync. Все работает нормально, но DSL-соединение, с которого отправляются данные резервной копии, будет прерываться раз в 24 часа на срок до 3 минут (смена провайдеров невозможна).

Как я:

  1. Автоматически перезапустить передачу при восстановлении соединения?

  2. Убедитесь, что не случайно две команды rsync работают одновременно?


Вы не можете проверить код возврата? while ./run_script; do echo "Retrying..."; done; echo "Done."Убедитесь, что run_scriptвозвращается 0на успех.
Kerrek SB

Возможный дубликат serverfault.com/q/98745 .
Танус

Некоторая полезная информация здесь - я просто хочу добавить, что один из способов обойти проблему повторного запроса пароля - использовать команду 'sshpass'. Обычно это должно быть установлено с помощью apt-get и т. Д.
Рэйчел Сондерс

Ответы:


52

Следующее должно быть полезно:

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial source dest
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

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


1
Спасибо, я пытаюсь это сейчас ... но если это так: if ["$?" = "0"] not be: if ["$?" == "0"] (оператор сравнения)?

1
Нет, в bash "=" - равенство строк (я думаю, это одна из многих вещей, которая делает его запутанным!)
Peter

6
== является псевдонимом для =: D
bbaja42

8
Ах, приятно знать. bash никогда не перестанет меня удивлять / ужасать :-P
Питер

2
Поздно к вечеринке, однако для потомков: A) просто используйте: if rsync -avz --partial source dest; затем ... B) если вы хотите сравнить целые значения, если использовать двойные круглые скобки для арифметического расширения: if (($? = 0)) then;
user18402

7

Это делает то же самое, что и ответ Питера, но дает пользователю возможность выбрать, какой удаленный файл он хочет и где он хочет сохранить (а также выполнить rsync через ssh). Замените USER и HOST на свое имя пользователя и хост соответственно.

#! / Bin / Баш
echo -e "Пожалуйста, введите полный (экранированный) путь к файлу:"
путь чтения -r
echo "Path: $ path"
echo -e "Введите пункт назначения:"
читать -r дст
echo "Направление: $ dst"
в то время как [1]
делать
    rsync --progress --partial --append -vz -e ssh "USER @ HOST: $ path" $ dst
    если ["$?" = "0"]; тогда
        echo "rsync завершен нормально"
        Выход
    еще
        echo "rsync fail. Повторная попытка через минуту ..."
        спать 60
    фи
сделанный

Используемые здесь параметры rsync включают статистику хода выполнения во время передачи, сохранение частичных файлов при неожиданном сбое и возможность добавлять частично заполненные файлы при возобновлении. Опция -v увеличивает многословность, опция -z включает сжатие (хорошо для медленного соединения, но требует больше ресурсов процессора на обоих концах), а опция -e позволяет нам выполнять эту передачу по ssh (шифрование всегда хорошо).

Примечание. Используйте это только в том случае, если у вас есть доступ с открытым ключом для вашего ssh, в противном случае он будет запрашивать пароль при перезапуске (уничтожая все функции скрипта).


1
Это лучший ответ на оригинальный вопрос. Это также относится к дубликатам с неправильным ответом по адресу: serverfault.com/questions/98745/…
rickfoosusa

5

Демон supervisor (диспетчер управления процессами) может очень хорошо работать после создания сертификатов rsa обеих сторон, с подобной конфигурацией, как указано ниже: (/ etc / supervisor / supervisord.conf - это путь к файлу конфигурации в системах на основе debian)

[program:rsync-remoteserver]
command=rsync -avz --progress root@server.com:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath

1

Ответ @ Питера кажется очень полезным, но для меня было важно использовать --updateопцию. После возобновления соединения без --updatersync пытался синхронизировать все с самого начала. При этом --updateфайлы, которые уже существуют, пропускаются.

rsync --partial --update --progress -r [SOURCE] [DESTINATION]


2
--updateпропускает файлы, которые уже существуют ... Включая те, которые не были полностью скопированы к цели. Я думаю, что это идет вразрез с большинством вариантов использования.
дурум

@durum это не так, по крайней мере, на rsync 3.1.2. после прерванной передачи я вижу, что он работает правильно на том же файле. Я использовал rsync поверх ssh, команда была rsync --partial --update file1 remotehost:file1. после перевода 15% я нарушил перевод (kill -KILL).
Филипрем
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.