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.