Bozuk bağlantıdan sonra SSH üzerinden rsync başlatılsın mı?


45

Rsync kullanarak ssh üzerinden büyük miktarda veri (> 80 GB) aktarmam gerekiyor. Her şey yolunda gidiyor, ancak yedekleme verilerinin gönderildiği DSL bağlantısı her 24 saatte bir 3 dakikaya kadar düşecek (sağlayıcıları değiştirmek bir seçenek değil).

Nasıl yapabilirim:

  1. Bağlantı yedeklendiğinde aktarım otomatik olarak yeniden başlatılsın mı?

  2. Kazayla aynı anda çalışan iki rsync komutunun olmadığından emin olun.


Dönüş kodunu kontrol edemez misin? Başarıdan geri dönüş while ./run_script; do echo "Retrying..."; done; echo "Done."aldığınızdan emin olun . run_script0
Kerrek SB,

Olası yinelenen serverfault.com/q/98745 .
tanius

Burada bazı yararlı bilgiler - Sadece tekrar tekrar şifre sorma sorununu aşmanın bir yolunun 'sshpass' komutunu kullanmak olduğunu eklemek istiyorum. Genellikle bunun apt-get vb. İle kurulması gerekir.
Rachael Saunders

Yanıtlar:


52

Aşağıdakiler yardımcı olacaktır:

#!/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

Bağlantı kesildiğinde, rsync, sıfır olmayan bir çıkış koduyla sonlandırılacak. Bu betik, senkronizasyon normal şekilde tamamlanana kadar devam etmesine izin vererek, rsync'i yeniden çalıştırmaya devam eder.


1
Teşekkürler, şimdi bunu deniyorum ... ama şunu yapmalı: eğer ["$?" = "0"] olamaz: eğer ["$?" == "0"] (karşılaştırma operatörü)?

1
Hayır, bash "=" string eşitliğidir (kafa karıştırıcı yapan şeylerden biri sanırım!)
Peter

6
== =: D
bbaja42

8
Ah, bilmek güzel. bash beni şaşırtmaya / dehşete düşürmekten asla vazgeçmeyecek :-P
Peter

2
Partiye geç, ancak gelecek vaadeden dolayı: A) sadece şunu kullanın: eğer rsync -avz - kısmi kaynak dest; öyleyse ... B) Aritmetik genişleme için çift parantez kullanıyorsanız integral değerleri karşılaştırmak istiyorsanız: if (($? = 0)) o zaman;
user18402

7

Bu Peter'ın cevabının aynısıdır, ancak kullanıcıya hangi uzak dosyayı istediği ve onu saklamak istediği bir seçenek sunar (rsync'i ssh üzerinden yürütmek gibi). USER ve HOST kodlarını sırasıyla kullanıcı adınız ve ana bilgisayarınızla değiştirin.

#! / Bin / bash
echo -e "Lütfen tam (kaçan) dosya yolunu girin:"
-r yolunu oku
echo "Yol: $ yol"
echo -e "Hedefi giriniz:"
-r dst oku
echo "Hedef: $ dst"
iken [1]
yap
    rsync - ilerleme - kısmi - ek - vz - e ssh "USER @ HOST: $ path" $ dst
    eğer ["$?" = "0"]; sonra
        echo "rsync normalde tamamlandı"
        çıkış
    Başka
        echo "rsync hatası. Bir dakika içinde yeniden deneniyor ..."
        60 uyku
    fi
tamam

Burada kullanılan rsync seçenekleri, transfer sırasındaki ilerleme istatistiklerini, beklenmedik bir hata durumunda kısmi dosyaların kaydedilmesini ve devam ettirildiğinde kısmen tamamlanmış dosyaların eklenebilmesini sağlar. -V seçeneği ayrıntı düzeyini artırır, -z seçeneği sıkıştırmayı sağlar (yavaş bağlantı için iyidir, ancak her iki uçta daha fazla işlemci gücü gerektirir) ve -e seçeneği bu aktarımı ssh üzerinden yapmamızı sağlar (şifreleme her zaman iyidir).

Not: Bunu sadece ssh ile etkin ortak anahtar girişi yaptıysanız kullanın, aksi halde yeniden başladığında sizden şifre isteyecektir (betiğin tüm işlevlerini öldürür).


1
Bu, orijinal sorunun en iyi cevabıdır. Aynı zamanda yanlış cevap veren bir kopya için de geçerlidir: serverfault.com/questions/98745/…
rickfoosusa

5

süpervizör arka plan programı (bir işlem kontrol yöneticisi), aşağıdaki gibi benzer bir konfigürasyonla her iki tarafın rsa sertifikası oluşturduktan sonra çok iyi çalışabilir: (/ etc / supervisor / supervisord.conf, debian tabanlı sistemlerde konfigürasyon dosyası yoludur)

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

1

@ Peter'ın cevabı çok yararlı görünüyor, ancak benim için --updateseçeneği kullanmak önemliydi . Bağlantı yeniden başlatıldıktan sonra, --updatersync olmadan hepsini en baştan senkronize etmeye çalışıyordu. İle --updatezaten var olan dosyalar atlanır.

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


2
--updatezaten var olan dosyaları atlar ... Hedefe tamamen kopyalanmamış olanlar dahil. Bence çoğu kullanıma karşı çıkıyor.
durum

@durum en azından rsync için doğru değil 3.1.2. Aktarım kesildikten sonra aynı dosya üzerinde düzgün çalıştığını görüyorum. Komutu ssh üzerinden rsync kullandım rsync --partial --update file1 remotehost:file1. % 15 transfer yaptıktan sonra transferi kırdım (-KILL).
filiprem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.