rsync expiré

5

Je dois synchroniser un répertoire sur un répertoire d'un serveur distant. Pour le moment, je rsync -cafais 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 findet pour chaque trouvé rsyncsur 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]
k.mooijman
la source

Réponses:

4

Il semble que le serveur ait dépassé son délai de connexion au niveau de la connexion SSH.

J'ai donc ajouté ces paramètres:

KeepAlive yes
ServerAliveInterval 20
ServerAliveCountMax 6

au /etc/ssh/ssh_config(ou ~/.ssh/config) et maintenant, il semble prometteur.

k.mooijman
la source
1
C’était définitivement le problème de mon client ssh. Après avoir ajouté cela à / etc / ssh / ssh_config, le rsync est resté stable.
k.mooijman
ServerAliveInterval 20 est-il obligatoire ici?
Rzr
L'ajout de cela à mon fichier ~ / .ssh / config a résolu l'erreur de canal cassé que je recevais avec rsync. Merci.
Dylan Hogg
2

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 exemple SO_RCVTIMEOUT=0pour désactiver les délais d'attente pour la réception de données.

Deuxièmement, l' --progress-fileoption 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:

for i in ls /path/to/dir; do rsync -ca $i remoteserver:/path/to/dir; done

Quatrièmement, vous pouvez utiliser ssh comme mécanisme de transfert et utiliser ses options TCPKeepAliveet ServerAliveInterval/ ServerAliveCountMaxde 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 -zqui compressera pendant le transport et le drapeau --partialpour 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.

Jenny D
la source
on dirait qu’il commence par calculer TOUTES les sommes de contrôle avant de commencer le transfert. Y a-t-il un moyen de calculer la somme de contrôle du premier et, le cas échéant, des transferts, puis de calculer le second?
k.mooijman
Si vous n'utilisez pas l' -coption, les sommes de contrôle ne seront pas utilisées du tout, ce serait donc un moyen.
Jenny D
tu as raison mais j'avais l'intention de vérifier l'intégrité de tous les fichiers, c'est donc -cun must pour moi
k.mooijman
OK, j'ai ajouté quelques façons possibles de le gérer.
Jenny D
1

Peut-être quelque chose comme ça?

find . -type f -exec 'rsync' '{}' ';'

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:

find . -not -type f -exec 'rsync' '{}' ';'

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 grepping timeout. Avez-vous envisagé de les utiliser?

un CVn
la source
Merci pour l'aide et vous aviez raison! j'ai réussi à le résoudre avec le délai d'attente de ssh
k.mooijman
@ k.mooijman Glad si j'ai pu aider. Si vous pensez avoir répondu à la question, veuillez accepter la réponse que vous avez trouvée la plus utile en cliquant sur le coche en regard.
un CVn
0

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 ( -zou --compress) corrigeait le problème. Le transfert a repris presque immédiatement.

TheLQ
la source