Відновити rsync через SSH після зламаного з'єднання?


45

Я повинен передавати великі обсяги даних (& gt; 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 .
tanius

Деяка корисна інформація тут - я просто хочу додати, що одним із способів обійти проблему з повторним запитом пароля є використання команди 'sshpass'. Зазвичай це потрібно встановити за допомогою apt-get і т.д.
Rachael Saunders

Відповіді:


48

Корисним є наступне:

#!/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
Спасибі, я намагаюся це зараз ... але це слід: якщо ["$?" = "0"] не буде: if ["$?" == "0"] (оператор порівняння)?

1
Ні, у bash "=" це рядова рівність (одна з багатьох речей, що робить його заплутаним, я думаю!)
Peter

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

8
Ах, добре знати. bash ніколи не перестане дивувати / здивувати мене :-P
Peter

2
Пізно до партії, однак для потомства: А) просто використовуйте: якщо rsync -avz - частковий джерело dest; потім ... B) якщо ви хочете порівняти інтегральні значення, якщо використовуєте подвійні дужки для арифметичного розширення: if (($? = 0));
user18402

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 ввімкнено вхід з відкритим ключем, інакше він запитає вас про пароль, коли він перезавантажується (знищуючи всі функції скрипту).


Це найкраща відповідь на оригінальне запитання. Він також застосовується до дублікату з неправильною відповіддю на адресу: serverfault.com/questions/98745/…
rickfoosusa

4

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

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

2

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

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


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

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