La reprise de rsync partielle (-P/--partielle) sur un transfert interrompu
Je suis en train de sauvegarde de mon serveur de fichiers pour supprimer un serveur de fichiers à l'aide de rsync. Rsync n'est pas réussi à reprendre lorsqu'un transfert est interrompu. J'ai utilisé l'option partielle mais rsync ne trouve pas le fichier qu'il est déjà démarré parce qu'il renomme un fichier temporaire et lors de la reprise de la il crée un nouveau fichier et commence à partir du début.
Est ici mon commandement:
rsync -avztP -e "ssh -p 2222" /volume1/myaccont@backup-server-1:/home/myaccount/backup/--exclude "@spool" --exclude "@tmp"
Lorsque cette commande est lancée, un fichier de sauvegarde nommé OldDisk.dmg de ma machine locale créé sur la machine distante comme quelque chose comme .OldDisk.dmg.SjDndj23.
Maintenant, quand la connexion internet est interrompu et je dois reprendre le transfert, je dois trouver où rsync laissé par trouver le fichier temp comme .OldDisk.dmg.SjDndj23 et le renommer en OldDisk.dmg afin qu'il voit, il existe déjà un fichier qu'il peut reprendre.
Comment puis-je résoudre ce problème donc je n'ai pas à intervenir manuellement à chaque fois?
Vous devez vous connecter pour publier un commentaire.
TL;DR: Utilisation
--timeout=X
(X en secondes) pour modifier la valeur par défaut délai d'expiration du serveur rsync, pas--inplace
.Le problème est le serveur rsync processus qui sont au nombre de deux, voir
rsync --server ...
dansps
sortie sur le récepteur) continue de fonctionner, à attendre le client rsync pour envoyer des données.Si le serveur rsync processus ne reçoit pas de données pendant un temps suffisant, ils seront, en effet, le délai d'attente, l'auto-fin et le nettoyage par le déplacement du fichier temporaire à son "vrai" nom (par exemple, aucune temporaire suffixe). Vous serez alors en mesure de reprendre.
Si vous ne voulez pas attendre pour le long délai d'attente par défaut pour provoquer le serveur rsync à l'auto-résilier, puis lors de votre connexion internet renvoie, connectez-vous au serveur et de nettoyer le serveur rsync processus manuellement. Cependant, vous doit poliment mettre fin à rsync -- dans le cas contraire, il ne sera pas déplacer le fichier partiel en place; mais, plutôt, de le supprimer (et donc il n'existe pas de fichier à reprendre). Pour demander poliment rsync pour terminer, de ne pas
SIGKILL
(par exemple,-9
), maisSIGTERM
(par exemple,pkill -TERM -x rsync
- seulement un exemple, vous devez prendre soin de correspondre uniquement les processus rsync concerné par votre client).Heureusement, il existe un moyen plus simple: utiliser le
--timeout=X
(X en secondes) de l'option; il est transmis au serveur rsync processus.Par exemple, si vous spécifiez
rsync ... --timeout=15 ...
, à la fois le client et le serveur rsync processus de sortie correctement si ils ne sont pas envoyer/recevoir des données dans les 15 secondes. Sur le serveur, cela signifie que le déplacement du fichier temporaire en position, prêt pour la reprise.Je ne suis pas sûr de la valeur de délai par défaut des différents processus rsync va essayer d'envoyer/recevoir des données avant de mourir (il peut varier selon le système d'exploitation). Dans mes tests, le serveur rsync processus restent en cours d'exécution plus long que le client local. Sur une "mort" de la connexion réseau, le client met fin à un bris de tuyau (par exemple, pas de prise réseau) après environ 30 secondes; vous pourriez expérimenter ou de revoir le code source. Sens, vous pourriez essayer de "rouler" la mauvaise connexion internet pendant 15 à 20 secondes.
Si vous ne nettoyez pas le serveur rsync processus (ou d'attendre pour eux de mourir), mais au lieu de lancer immédiatement un autre client rsync processus, deux autres processus serveur va lancer (pour l'autre extrémité de votre nouveau processus client). Plus précisément, le nouveau client rsync ne réutilisation/reconnecter à l'existant serveur rsync processus. Ainsi, vous aurez deux fichiers temporaires (et quatre serveur rsync processus) -- bien que, seule la plus récente, deuxième fichier temporaire a de nouvelles données écrites (reçu à partir de votre nouveau client rsync processus).
Intéressant, si vous puis de nettoyer tous les serveur rsync processus (par exemple, arrêt de votre client qui sera le nouveau serveurs rsync, puis
SIGTERM
les anciens serveurs rsync, il semble de fusion (assembler) tous les fichiers partiels dans le nouveau bon nom de fichier. Alors, imaginez une longue course copie partielle qui meurt (et vous pensez que vous avez "perdu" toutes les données copiées), et une courte course relancée rsync (oups!).. vous pouvez arrêter le deuxième client,SIGTERM
les premiers serveurs, il va fusionner les données, et vous pouvez reprendre.Enfin, quelques remarques:
--inplace
à cette solution de contournement. Vous aurez sans doute d'autres problèmes comme un résultat,man rsync
pour plus de détails.-t
dans vos options de rsync est redondant, il est sous-entendu par-a
.--checksum
/-c
, il ne vous aide pas dans ce cas. Il affecte la façon dont rsync décide si elle devrait de transfert d'un fichier. Si, après une première rsync est terminée, vous pouvez exécuter une deuxième rsync avec-c
d'insister sur les sommes de contrôle, afin de prévenir l'étrange affaire que la taille du fichier et modtime sont les mêmes sur les deux côtés, mais les données de mauvaise qualité a été écrit.SIGINT
(aka^C
) être "politer" queSIGTERM
?Ctrl-c
; il arrive que votre terminal envoieSIGINT
les processus d'arrière-plan lorsque vous appuyez surCtrl-c
, mais le côté serveur rsync n'a pas de terminal de contrôle. Vous devez vous connecter au serveur et d'utiliserkill
. Le côté client rsync ne seront pas envoyer un message au serveur (par exemple, après que le client reçoitSIGINT
via votre terminalCtrl-c
) - pourrait être intéressant. Comme pour anthropomorphizing, pas sûr de ce qui est "politer". 🙂rsync -av --delete --progress --stats --human-readable --checksum --timeout=60 --partial-dir /tmp/rsync/ rsync://$remote:/ /src/
mais ensuite il a expiré au cours de la "réception de la liste de fichiers" phase (qui dans ce cas prend environ 30 minutes). Réglage du délai d'attente d'une demi-heure, la gentillesse de confie le but. Toute solution pour cela?Désolé, mais les autres réponses sont ici trop compliqué :-7.
Une simple réponse de travailler pour moi: (à l'aide de rsync over -e ssh)
Fonctionne également lors de la reprise d'une scp, qui a été interrompu.
Rsync crée un fichier temporaire ... Le fichier temporaire se développe rapidement à la taille de l'partiellement fichier transféré. Transfert d'un curriculum vitae.
Scp écrit à la fin du fichier de destination . Si le transfert est interrompu, c'est un fichier tronqué.
Explication de args:
-avhz .. h=humanoïde, v=verbose, - un=archive, z=compression
.. archives de charge pour maintenir les valeurs time_t donc, même si les horloges sont rsync en connaît la véritable date de chaque fichier
-P est l'abréviation de --partielle, des progrès.
--partielle dit à rsync de conserver partiellement transféré des fichiers (et au moment de reprendre rsync va utiliser partiellement transféré des fichiers toujours après le calcul des sommes de contrôle en toute sécurité)
De l'homme pages:
http://ss64.com/bash/rsync_options.html
REMARQUE: pour une fois que la connexion est interrompue plusieurs fois:
Si vous avez besoin de reprendre après rsync (après la connexion est interrompue) il est préférable de renommer le fichier temporaire sur la destination. scp crée un fichier de destination avec le même nom de fichier final. Si scp est interrompu, ce fichier est une version tronquée du fichier. Rsync (-avzhP) reprendra à partir de ce fichier, mais de commencer l'écriture d'un nom de fichier temporaire comme ..Yhg7al.
De la procédure de départ auprès de la scp:
De la procédure de départ avec rsync:
--progress
implique--verbose
.--partial
garde partielle des fichiers, mais pour reprendre de ceux-ci, on devrait utiliser--append
ou--append-verify
et la cible doit être inférieure à la source, en dépit de la source plus récente de l'heure.J'ai trouvé que l'ajout de --place fixe. Vous ne savez pas comment --partielle est censé fonctionner sans elle, mais elle a repris ma transferts. Mes fichiers sont encore assez grand bien et je me demande si je vais finir avec des fichiers corrompus si un transfert commence et des heures plus tard, un autre transfert démarre mais voit un dossier incomplet et ne connaît pas son actuellement en cours de téléchargement qui puis commence à ajouter des octets à elle. Tout le monde sait? Peut-être que certains scripts bash pour le journal le courant id de processus et de ne pas commencer un autre transfert?
--append-verify
implique--inplace
mais ignore le contenu qui n'a pas besoin d'ajout.si vous avez peur de corrompre des fichiers après un curriculum vitae, vous pouvez ajouter
--checksum
pour le forcer à faire de somme de contrôle sur l'ensemble du dossier à chaque fois. En effet il va vous coûter de disque-IO et de cycles de PROCESSEUR, mais seulement une légère surcharge du réseau.man rsync
est de sommes de contrôle rsync de la détermination de ce qu'est le transfert, pas un post-transfert de validation, si c'est ce que vous êtes suggérant? Je ne vois pas comment la taille du fichier et modtime sera le même (donc exiger la somme de contrôle) si--inplace
est utilisée et qu'une connexion est abandonnée. Pour garantir que les données-de la justesse, de l'OP aurait besoin d'exécuter un second rsync avec-c
.