Come chiamare ripetutamente rsync fino a quando i file non vengono trasferiti correttamente


27

Sto cercando di sincronizzare i file da un server remoto che non è affidabile, il che significa che la connessione tende a fallire "in modo casuale" con

rsync: connessione inaspettatamente chiusa

Rsync viene chiamato con --partial, quindi mi piacerebbe poter chiamare rsync in un ciclo fino a quando i file non vengono trasferiti completamente. Non sembra esserci una bandiera per dire a rsync di riprovare.

Quale sarebbe il modo migliore per scriverlo? Un bash per loop?


1
Mentre le risposte di seguito sono utili, potrebbe essere un'idea migliore scoprire perché sta fallendo e farlo smettere. Presumo che tu controlli il server, il client e la rete in mezzo, in modo da poter eseguire tcpdump in vari punti per vedere come è stato chiuso. Forse uno dei tuoi firewall o dispositivi VPN sta chiudendo la connessione?
Mark

Il server a cui si connette è un host condiviso, quindi non ho accesso root ad esso. Potrei capire perché sta chiudendo, ma per ora sono più che felice di riprovare. Grazie comunque per l'heads up
Bruno Lopes

Sono rimasto scioccato nello scoprire che rsync in realtà non ha avuto la possibilità di riprovare!
Michael,

rsync --partial --append ha la possibilità di riprovare, manualmente o in uno script, controllando il codice di ritorno. Duplicato di: superuser.com/questions/302842/…
rickfoosusa

Risposte:


29

Se stai sincronizzando tutto in un'unica sincronizzazione, chiama rsync in un ciclo fino a quando rsync ti dà un codice di ritorno corretto.

Qualcosa di simile a:

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

Questo eseguirà un ciclo, chiamando rsync, fino a quando non fornirà un codice di ritorno pari a 0. Potresti voler aggiungere uno sleep per evitare di DOSare il tuo server.


28
puoi semplicemente scrivere mentre! rsync -a ....; dormi 5; fatto
Justin

1
fai solo attenzione a come lo usi, ad esempio, se provi a eseguirlo tramite cron, potresti incorrere in problemi di concorrenza.
Keiran Holloway il

3
Questo si trasformerà in un ciclo infinito se si verifica un errore non transitorio (ad esempio un errore di autorizzazione durante la lettura o la scrittura di file). Ti consiglio di controllare lo stato di uscita di rsync per errori di rete specifici, qualcosa del genere RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](o qualunque stato di uscita che vedi dalle cadute di rete).
Gordon Davisson,

1
Dato che non sto eseguendo questo (completamente) incustodito, i loop infiniti e la concorrenza non sono un grosso problema, grazie.
Bruno Lopes,

2
È un peccato che rsync non abbia questa funzione integrata, perché qualsiasi tipo di loop basato su shell richiederà una password nei casi in cui l'autenticazione automatica non è disponibile o appropriata.
Michael,


1

purtting tutto insieme a 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.