Bagaimana cara memanggil rsync berulang kali sampai file berhasil ditransfer

27

Saya mencoba menyinkronkan file dari server jauh yang tidak dapat diandalkan, artinya koneksi cenderung gagal "secara acak"

rsync: koneksi ditutup secara tak terduga

Rsync disebut dengan --partial, jadi saya ingin dapat memanggil rsync dalam satu lingkaran sampai file sepenuhnya ditransfer. Tampaknya tidak ada bendera untuk memberitahu rsync untuk mencoba lagi.

Apa yang akan menjadi cara terbaik untuk skrip itu? Bash untuk loop?

Bruno Lopes
sumber
1
Meskipun jawaban di bawah ini membantu, mungkin ide yang lebih baik untuk mencari tahu mengapa itu gagal dan membuatnya berhenti. Saya berasumsi Anda mengendalikan server, klien dan jaringan di antaranya, sehingga Anda dapat menjalankan tcpdump di berbagai tempat untuk melihat bagaimana itu ditutup. Mungkin salah satu perangkat firewall atau VPN Anda sedang menutup koneksi?
MarkR
Server yang terhubung adalah host bersama, jadi saya tidak memiliki akses root untuk itu. Saya mungkin melihat mengapa itu ditutup, tetapi untuk sekarang saya lebih dari senang untuk mencoba lagi. Bagaimanapun juga, terima kasih atas perhatiannya
Bruno Lopes
Saya terkejut menemukan rsync tidak benar-benar memiliki kemampuan untuk mencoba lagi!
Michael
rsync --partial --append memang memiliki kemampuan untuk mencoba lagi, secara manual, atau dalam skrip yang memeriksa kode pengembalian. Duplikat dari: superuser.com/questions/302842/…
rickfoosusa

Jawaban:

29

Jika Anda menyinkronkan semuanya dalam satu sinkronisasi, panggil rsync dalam satu lingkaran sampai rsync memberi Anda kode pengembalian yang berhasil.

Sesuatu seperti:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

Ini akan berulang, memanggil rsync, hingga memberikan kode kembali 0. Anda mungkin ingin menambahkan tidur di sana untuk menjaga dari DOSing server Anda.

David
sumber
28
Anda bisa menulis sambil! rsync -a ....; lakukan tidur 5; selesai
Justin
1
hanya berhati-hatilah bagaimana Anda menggunakan ini, misalnya, jika mencoba menjalankannya melalui cron maka Anda bisa mengalami masalah konkurensi.
Keiran Holloway
3
Ini akan berubah menjadi loop tak terbatas jika ada kesalahan non-transitent (mis. Kesalahan izin membaca atau menulis file). Saya akan merekomendasikan memeriksa status keluar rsync untuk kesalahan jaringan tertentu, seperti RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](atau status keluar apa pun yang Anda lihat dari tetes jaringan).
Gordon Davisson
1
Karena saya tidak menjalankan ini (sepenuhnya) tanpa pengawasan, loop tak terbatas dan konkurensi tidak banyak menjadi masalah, terima kasih.
Bruno Lopes
2
Sayang sekali rsync tidak memiliki fitur ini bawaan, karena segala jenis loop berbasis shell akan meminta kata sandi dalam kasus di mana otentikasi otomatis tidak tersedia atau tidak sesuai.
Michael
1

purtting semuanya bersama dengan sshpass

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
Toolkit
sumber