38 votes

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

J'essaie de synchroniser des fichiers à partir d'un serveur distant qui n'est pas fiable, c'est-à-dire que la connexion a tendance à échouer de façon "aléatoire" avec des problèmes de sécurité.

rsync : connexion fermée de manière inattendue

Rsync est appelé avec --partial, j'aimerais donc 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 dire à rsync de réessayer.

Quelle serait la meilleure façon de le script ? Un script ?

1 votes

Bien que les réponses ci-dessous soient utiles, il serait peut-être préférable de trouver la raison de cet échec et de le faire cesser. Je suppose que vous contrôlez le serveur, le client et le réseau entre les deux, donc vous pouvez exécuter tcpdump à différents endroits pour voir comment il a été fermé. Peut-être que l'un de vos pare-feu ou dispositifs VPN ferme la connexion ?

0 votes

Le serveur auquel il se connecte est un hôte partagé, je n'ai donc pas d'accès root. Je vais peut-être chercher à savoir pourquoi il se ferme, mais pour l'instant je suis plus qu'heureux de le voir réessayer. Merci quand même de m'avoir prévenu

1 votes

J'ai été choqué de découvrir que rsync n'avait pas la capacité de réessayer !

42voto

David Points 3489

Si vous voulez tout synchroniser en une seule fois, appelez rsync en boucle jusqu'à ce que rsync vous donne un code de retour réussi.

Quelque chose comme :

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

Cela tournera en boucle, appelant rsync, jusqu'à ce qu'il donne un code de retour de 0. Vous pouvez ajouter un sleep là-dedans pour éviter de DOSer votre serveur.

42 votes

Vous pouvez juste écrire while ! rsync -a .... ;do sleep 5;done

0 votes

J'utilise maintenant le format mentionné par @Justin et cela fonctionne à merveille :) Merci !

1 votes

Faites juste attention à la façon dont vous utilisez cette fonction, par exemple, si vous essayez de l'exécuter via cron, vous pourriez rencontrer des problèmes de concurrence.

15voto

J'ai rencontré le même problème il y a quelque temps. J'ai fini par écrire quelque chose de similaire à la réponse de David, mais en l'améliorant un peu avec des tentatives maximales, la réponse à Ctrl-C, etc : http://blog.iangreenleaf.com/2009/03/rsync-and-retrying-until-we-get-it.html .

La solution évidente est de vérifier la valeur de retour, et si rsync renvoie autre chose que le succès, exécutez-le à nouveau. Voici mon premier essai :

while [ $? -ne 0 ]; do rsync -avz --progress --partial /rsync/source/folder backupuser@backup.destination.com:/rsync/destination/folder; done

Le problème est que si vous voulez arrêter le programme, Ctrl-C n'arrête que le processus rsync en cours, et la boucle en lance un autre immédiatement. Pire encore, ma connexion continuait à se rompre si fort que rsync s'arrêtait avec le même code d'erreur "unkown" sur les problèmes de connexion que sur un SIGINT, donc je ne pouvais pas avoir ma boucle différencier et casser quand c'était nécessaire. Voici mon script final :

#!/bin/bash

### ABOUT
### Runs rsync, retrying on errors up to a maximum number of tries.
### Simply edit the rsync line in the script to whatever parameters you need.

# Trap interrupts and exit instead of continuing the loop
trap "echo Exited!; exit;" SIGINT SIGTERM

MAX_RETRIES=50
i=0

# Set the initial return value to failure
false

while [ $? -ne 0 -a $i -lt $MAX_RETRIES ]
do
 i=$(($i+1))
 rsync -avz --progress --partial /rsync/source/folder backupuser@backup.destination.com:/rsync/destination/folder
done

if [ $i -eq $MAX_RETRIES ]
then
  echo "Hit maximum number of retries, giving up."
fi

10voto

Toolkit Points 149

Purger le tout avec 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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X