Je dois synchroniser un répertoire sur un répertoire d'un serveur distant. Pour le moment, je rsync -ca
fais cela mais le répertoire est assez volumineux et tout le processus échoue avec une erreur de dépassement de délai.
Maintenant, je recherche une synchronisation fichier par fichier au lieu d'une approche «tout à la fois». comme find
et pour chaque trouvé rsync
sur le serveur. Quel serait le moyen le plus facile de faire cela?
Je reçois l'erreur suivante:
receiving incremental file list
Write failed: Broken pipe
rsync: connection unexpectedly closed (1175057 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601)[receiver=3.0.7]
rsync: connection unexpectedly closed (287 bytes received so far) [generator]
rsync error: unexplained error (code 255) at io.c(601) [generator=3.0.7]
Mise à jour: Comme le délai d'attente semble se produire lorsque rsync crée les sommes de contrôle, voici différentes approches qui peuvent fonctionner.
Premièrement, pour ne garder qu’un seul rsync ouvert, vous pouvez (en plus des options mentionnées par Michael Kjörling) jouer avec l’option
--sockopts
. Cela vous donne la possibilité de définir le même type d'options de socket que vous pouvez définir lors de la création d'un socket dans le code, par exempleSO_RCVTIMEOUT=0
pour désactiver les délais d'attente pour la réception de données.Deuxièmement, l'
--progress-file
option peut suffire à ne pas déclencher le délai d'attente, en renvoyant en permanence des informations de progression.Troisièmement, vous pouvez faire une synchronisation fichier par fichier, par exemple comme ceci:
Quatrièmement, vous pouvez utiliser ssh comme mécanisme de transfert et utiliser ses options
TCPKeepAlive
etServerAliveInterval
/ServerAliveCountMax
de manière appropriée pour maintenir la connexion active.Réponse originale: rsync déjà fait une approche fichier par fichier - il vérifiera chaque fichier dans la liste des fichiers à être synchronisés, et ne synchroniser ceux qui n'existent pas sur le système cible, ou qui sont différents de ces fichiers sur le système cible.
Ce que vous pouvez faire pour réduire le temps de transfert est d’utiliser l’option
-z
qui compressera pendant le transport et le drapeau--partial
pour que, si le transfert est interrompu, vous conserviez tout fichier partiellement synchronisé afin que rsync puisse continuer où il était. Les options --timeout et --ontimeout mentionnées par Michael Kjörling seraient également utiles.la source
-c
option, les sommes de contrôle ne seront pas utilisées du tout, ce serait donc un moyen.-c
un must pour moiPeut-être quelque chose comme ça?
Ceci exécutera une fois rsync pour chaque fichier normal du répertoire en cours, en passant le nom du fichier (représenté par le
{}
jeton) en tant que paramètre de ligne de commande.Si vous avez des liens symboliques, des fichiers de périphérique, etc. dans le répertoire en question, vous pouvez essayer d'inverser la logique:
Cela devrait "fonctionner", dans le sens de faire ce que vous demandez (lancer rsync une fois par fichier). Mais j'ai l'impression que vous vous y prenez mal.
La page de manuel rsync répertorie
--timeout
(délai d’expiration des E / S) et--contimeout
(délai de connexion), et c’est juste pour greppingtimeout
. Avez-vous envisagé de les utiliser?la source
Pour moi, cela continuait à reprendre un grand transfert rsync sur une connexion un peu lente. J'utilisais même rsyncd pour éviter tous les problèmes avec ssh.
J'ai trouvé que l'activation de la compression (
-z
ou--compress
) corrigeait le problème. Le transfert a repris presque immédiatement.la source