45

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

Как я:

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

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

4 ответа4

50

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

#!/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, позволяя ему продолжаться до тех пор, пока синхронизация не завершится нормально.

7

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

#!/bin/bash
echo -e "Please enter the full (escaped) file path:"
read -r path
echo "Path: $path"
echo -e "Enter the destination:"
read -r dst
echo "Destination: $dst"
while [ 1 ]
do
    rsync --progress --partial --append -vz -e ssh "USER@HOST:$path" $dst
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "rsync failure. Retrying in a minute..."
        sleep 60
    fi
done

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .