Jak wielokrotnie wywoływać rsync, dopóki pliki nie zostaną pomyślnie przesłane

27

Próbuję zsynchronizować pliki ze zdalnego serwera, który nie jest niezawodny, co oznacza, że ​​połączenie zawiesza się „losowo” z

rsync: połączenie niespodziewanie zamknięte

Rsync jest wywoływany z --partial, więc chciałbym móc wywoływać rsync w pętli, dopóki pliki nie zostaną w pełni przesłane. Wydaje się, że nie ma flagi, która mówi rsync, aby spróbowała ponownie.

Jaki byłby najlepszy sposób na napisanie skryptu? Bash dla pętli?

Bruno Lopes
źródło
1
Chociaż poniższe odpowiedzi są pomocne, lepszym pomysłem może być ustalenie przyczyny niepowodzenia i zatrzymanie go. Zakładam, że kontrolujesz serwer, klienta i sieć pomiędzy nimi, więc możesz uruchomić tcpdump w różnych miejscach, aby zobaczyć, jak został zamknięty. Być może jedno z twoich zapór ogniowych lub urządzeń VPN zamyka połączenie?
MarkR
Serwer, z którym się łączy, jest hostem współdzielonym, więc nie mam do niego uprawnień roota. Może zastanowię się, dlaczego się kończy, ale na razie jestem bardzo szczęśliwy, że mogę spróbować ponownie. W każdym razie dzięki za heads-up
Bruno Lopes,
Byłem zszokowany, gdy odkryłem, że rsync nie miał możliwości ponownej próby!
Michael
rsync --partial --append ma możliwość ponownej próby, ręcznie lub w skrypcie sprawdzającym kod powrotu. Duplikat: superuser.com/questions/302842/…
rickfoosusa 23.01.16

Odpowiedzi:

29

Jeśli synchronizujesz wszystko podczas jednej synchronizacji, wywołaj rsync w pętli, aż rsync da ci pomyślny kod powrotu.

Coś jak:

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

Spowoduje to zapętlenie, wywoływanie rsync, aż da kod powrotu 0. Możesz chcieć dodać tam sen, aby nie dopuścić do DOSowania serwera.

David
źródło
28
możesz po prostu pisać! rsync -a ....; spać 5; gotowe
Justin
1
po prostu uważaj, jak tego używasz, na przykład, jeśli spróbujesz uruchomić go za pomocą crona, możesz napotkać problemy z współbieżnością.
Keiran Holloway
3
Zmieni się to w nieskończoną pętlę, jeśli wystąpi błąd nieprzechodni (np. Błąd uprawnień podczas odczytu lub zapisu plików). Polecam sprawdzenie statusu wyjścia rsync pod kątem określonych błędów sieci, czegoś takiego RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](lub innych statusów wyjścia, które widzisz po upadku sieci).
Gordon Davisson
1
Ponieważ nie uruchamiam tego (całkowicie) bez nadzoru, nieskończone pętle i współbieżność nie stanowią większego problemu, dziękuję.
Bruno Lopes,
2
Szkoda, że ​​rsync nie ma tej wbudowanej funkcji, ponieważ jakakolwiek pętla oparta na powłoce wyświetli monit o podanie hasła w przypadkach, gdy automatyczne uwierzytelnianie nie jest dostępne lub odpowiednie.
Michael
1

purtting to wszystko razem z 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
zestaw narzędzi
źródło