Comment appeler à plusieurs reprises rsync jusqu'à ce que les fichiers soient transférés avec succès

27

J'essaie de synchroniser des fichiers à partir d'un serveur distant qui n'est pas fiable, ce qui signifie que la connexion a tendance à échouer "au hasard" avec

rsync: connexion inopinément fermée

Rsync est appelé avec --partial, donc j'aimerais pouvoir appeler rsync en boucle jusqu'à ce que les fichiers soient entièrement transférés. Il ne semble pas y avoir d'indicateur pour indiquer à rsync de réessayer.

Quelle serait la meilleure façon de l'écrire? Un bash pour la boucle?

Bruno Lopes
la source
1
Bien que les réponses ci-dessous soient utiles, ce serait peut-être une meilleure idée de savoir pourquoi cela échoue et de l'arrêter. Je suppose que vous contrôlez le serveur, le client et le réseau entre les deux, vous pouvez donc exécuter tcpdump à divers endroits pour voir comment il a été fermé. Peut-être qu'un de vos pare-feu ou périphériques VPN ferme la connexion?
MarkR du
Le serveur auquel il se connecte est un hôte partagé, donc je n'y ai pas accès root. Je pourrais peut-être voir pourquoi il ferme, mais pour l'instant je suis plus qu'heureux de le faire réessayer. Merci quand même pour l'avertissement
Bruno Lopes
J'ai été choqué de découvrir que rsync n'avait pas réellement la possibilité de réessayer!
Michael
rsync --partial --append a la possibilité de réessayer, manuellement ou dans un script vérifiant le code retour. Duplicata de: superuser.com/questions/302842/…
rickfoosusa

Réponses:

29

Si vous synchronisez tout en une seule synchronisation, appelez rsync en boucle jusqu'à ce que rsync vous donne un code retour réussi.

Quelque chose comme:

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

Cela va boucler, en appelant rsync, jusqu'à ce qu'il donne un code retour de 0. Vous voudrez peut-être y ajouter un sommeil pour éviter de mettre votre serveur en DOS.

David
la source
28
vous pouvez simplement écrire tout! rsync -a ....; dors 5; fait
Justin
1
faites juste attention à la façon dont vous l'utilisez, par exemple, si vous essayez de l'exécuter via cron, vous pourriez rencontrer des problèmes de concurrence.
Keiran Holloway
3
Cela se transformera en une boucle infinie s'il y a une erreur non transitoire (par exemple une erreur d'autorisation de lecture ou d'écriture de fichiers). Je recommanderais de vérifier l'état de sortie de rsync pour des erreurs de réseau spécifiques, quelque chose comme RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](ou quels que soient les états de sortie que vous voyez des baisses de réseau).
Gordon Davisson
1
Comme je n'exécute pas (complètement) sans surveillance, les boucles infinies et la concurrence ne sont pas vraiment un problème, merci.
Bruno Lopes
2
C'est dommage que rsync n'ait pas cette fonctionnalité intégrée, car tout type de boucle basée sur le shell demandera un mot de passe dans les cas où l'authentification automatique n'est pas disponible ou appropriée.
Michael
1

purtting all all with 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
Boîte à outils
la source