Comment corriger l'erreur de paquet corrompu avec avec rsync pour les fichiers (relativement) volumineux?

10

Essayer de mettre à jour des fichiers sur un serveur, avec la rsynccommande:

rsync -ravq -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

corrupt packet les erreurs continuent d'être lancées, en particulier:

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]: Broken pipe (32)
rsync: connection unexpectedly closed (11337 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /home/lapo/package/rsync-3.0.9-1/src/rsync-3.0.9/io.c(605) [sender=3.0.9]

Ceci est probablement lié à un sshdélai d'attente, comme cela semble se produire avec des fichiers (r) volumineux. En outre, je continue d'obtenir des délais d'expiration en utilisant WinSCP. Cela n'arrive qu'à moi; plusieurs des personnes avec qui j'utilise ce serveur n'ont pas le même problème.

Utilisation rsyncdepuis un terminal Cygwin sous Windows 7, sur un serveur Centos 6.3.

Je ne sais pas quelles autres informations pourraient être utiles ni comment les obtenir. Je mettrai à jour la question ou ajouterai des commentaires selon toutes les suggestions.

Comment dois-je résoudre ce problème?

Merci beaucoup!

Juan Carlos Coto
la source

Réponses:

12

Je ne sais pas ce qui pourrait causer le corrupt packetproblème qui interrompt votre connexion, mais vous pouvez trouver rsync --partialou l' --partial-diroption utile lors du transfert de fichiers volumineux de sorte que lorsque vous redémarrez le transfert, il continuera là où le transfert s'est arrêté au lieu d'avoir à recommencer le transfert de la fichier entier à nouveau:

--partial-dir = .rsync-partial

Vous pouvez donc modifier votre commande d'origine comme ceci:

rsync -rav --progress --partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

ou

rsync -rav --progress --partial-dir=.rsync-partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

Notez que pour cet exemple, j'ai supprimé l' option -q( --quiet) et ajouté l' --progressoption dans le premier exemple et --partial-dir=.rsync-partialdans le deuxième exemple.

La différence entre --partialet --partial-dir=.rsync-partialest que ce dernier crée un répertoire qui garde les fichiers partiels séparés des fichiers entièrement transférés si cela est important pour vous du côté de la réception (serveur).

La page de manuel rsync expliquera cela plus en détail, mais je soulignerai également une note de sécurité importante de la page de manuel:

IMPORTANT: le répertoire -partial ne doit pas être accessible en écriture par d'autres utilisateurs ou il s'agit d'un risque pour la sécurité. Par exemple, ÉVITEZ "/ tmp".

aculich
la source
J'ai essayé les deux options et aucun des deux n'a résolu le problème. Merci pour l'allusion, cependant.
Juan Carlos Coto
1

La corruption suggère un mauvais NIC ou un pilote NIC dans votre machine; a eu ceci une fois sur la boîte Windows de ma femme: a dû essayer à plusieurs reprises d'installer rsync. Une fois que cela a réussi, je pouvais invoquer à plusieurs reprises rsync pour transférer et corriger les autres logiciels nécessaires, qui comprenaient notamment des pilotes NIC mis à jour et un outil de somme de contrôle.

Phil P
la source
0

Si la valeur ulimit est 0 ou un petit nombre, cela devrait donner cette erreur. Essayez d'augmenter la valeur ulimit (such as 9999999999)et réessayez. vous pouvez écrire un petit script shell (a.sh)et utiliser quelque chose comme ceci:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/
COA
la source
1
C'est intéressant. Je n'y travaille pas depuis un moment; cependant, si vous souhaitez expliquer pourquoi cela fonctionne, je pense que ce serait vraiment utile pour quiconque lit cette question. Merci!
Juan Carlos Coto
-1

boucle juste jusqu'à ce qu'il transfère enfin

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ [email protected]:/dest/; do sleep 5;done
Boîte à outils
la source