Lanjutkan rsync melalui SSH setelah koneksi terputus?

45

Saya harus mentransfer sejumlah besar data (> 80 GB) melalui ssh menggunakan rsync. Semuanya berfungsi dengan baik, tetapi koneksi DSL tempat data cadangan dikirim akan turun setiap 24 jam hingga 3 menit (beralih penyedia bukan pilihan).

Bagaimana saya:

  1. Mulai ulang transfer secara otomatis saat koneksi dicadangkan?

  2. Pastikan tidak ada dua perintah rsync yang berjalan secara bersamaan?

Sathyajith Bhat
sumber
Tidak bisakah Anda memeriksa kode pengembalian? while ./run_script; do echo "Retrying..."; done; echo "Done."Pastikan run_scriptkembali 0pada kesuksesan.
Kerrek SB
Kemungkinan duplikat dari serverfault.com/q/98745 .
tanius
Beberapa info berguna di sini - Saya hanya ingin menambahkan bahwa salah satu cara untuk menyelesaikan berulang kali meminta masalah kata sandi adalah dengan menggunakan perintah 'sshpass'. Biasanya ini perlu diinstal dengan apt-get dll.
Rachael Saunders

Jawaban:

52

Berikut ini harus membantu:

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

Ketika koneksi mati, rsync akan keluar dengan kode keluar yang tidak nol. Script ini terus menjalankan rsync, membiarkannya berlanjut sampai sinkronisasi selesai secara normal.

Peter
sumber
1
Terima kasih, saya mencoba ini sekarang ... tetapi haruskah ini: jika ["$?" = "0"] tidak boleh: jika ["$?" == "0"] (operator perbandingan)?
1
Tidak, dalam bash "=" adalah persamaan string (salah satu dari banyak hal yang membuatnya membingungkan, saya pikir!)
Peter
6
== adalah alias untuk =: D
bbaja42
8
Ah, senang tahu. pesta tidak akan pernah berhenti memukau / menakuti saya :-P
Peter
2
Terlambat ke pesta, namun untuk keturunan: A) gunakan saja: jika rsync -avz --partial source dest; lalu ... B) jika Anda ingin membandingkan nilai integral jika menggunakan tanda kurung ganda untuk ekspansi aritmatika: if (($? = 0)) lalu;
user18402
7

Ini tidak sama dengan jawaban Peter, tetapi memberikan pengguna pilihan file jarak jauh mana yang dia inginkan, dan di mana dia ingin menyimpannya (serta melakukan rsync di atas ssh). Ganti PENGGUNA dan HOST masing-masing dengan nama pengguna dan host Anda.

#! / bin / bash
echo -e "Silakan masukkan path file lengkap (lolos):"
baca -r path
gema "Path: $ path"
echo -e "Masukkan tujuan:"
baca -r dulu
echo "Tujuan: $ dst"
sementara [1]
melakukan
    rsync --progress --partial --append -vz -e ssh "USER @ HOST: $ path" $ dst
    jika ["$?" = "0"]; kemudian
        echo "rsync selesai secara normal"
        keluar
    lain
        gema "kegagalan rsync. Mencoba lagi dalam satu menit ..."
        tidur 60
    fi
Selesai

Opsi rsync yang digunakan di sini memungkinkan statistik kemajuan selama transfer, penyimpanan sebagian file saat terjadi kegagalan yang tidak terduga, dan kemampuan untuk menambahkan file yang diselesaikan sebagian saat resume. Opsi -v meningkatkan verbositas, opsi -z memungkinkan kompresi (bagus untuk koneksi yang lambat, tetapi membutuhkan lebih banyak daya cpu di kedua ujungnya), dan opsi -e memungkinkan kita untuk melakukan transfer ini melalui ssh (enkripsi selalu baik).

Catatan: Gunakan ini hanya jika Anda memiliki login kunci publik yang diaktifkan dengan ssh Anda, jika tidak maka akan meminta Anda kata sandi ketika restart (membunuh semua fungsi skrip).

KernelSanders
sumber
1
Ini adalah jawaban terbaik dari pertanyaan awal. Ini juga berlaku untuk duplikat dengan jawaban yang salah di: serverfault.com/questions/98745/…
rickfoosusa
5

daemon supervisor (manajer kontrol proses) dapat bekerja dengan sangat baik setelah membuat sertifikat rsa dari kedua sisi, dengan konfigurasi yang sama sebagai berikut: (/ etc / supervisor / supervisord.conf adalah path file konfigurasi pada sistem berbasis debian)

[program:rsync-remoteserver]
command=rsync -avz --progress [email protected]:/destination /backup-path
stdout_logfile=/out-log-path  
stderr_logfile=/errlogpath
ugurarpaci
sumber
1

Jawaban @ Peter sepertinya sangat berguna, tetapi bagi saya penting untuk menggunakan --updateopsi. Setelah koneksi dilanjutkan, tanpa --updatersync mencoba menyinkronkan semua dari awal. Dengan --update, file yang sudah ada dilewati.

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

YasiuMaster
sumber
2
--updatemelompati file yang sudah ada ... Termasuk yang belum sepenuhnya disalin ke target. Saya pikir itu bertentangan dengan kebanyakan kasus penggunaan.
durum
@durum itu tidak benar setidaknya di rsync 3.1.2. setelah transfer terputus saya melihatnya bekerja dengan baik pada file yang sama. Saya menggunakan rsync di atas ssh, perintahnya adalah rsync --partial --update file1 remotehost:file1. setelah mentransfer 15% saya memutuskan transfer (kill -KILL).
filiprem