Como corrigir erro de pacote corrompido no rsync para arquivos (relativamente) grandes?

10

Tentando atualizar arquivos em um servidor, com o rsynccomando:

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

corrupt packet erros continuam sendo gerados, especificamente:

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]

Provavelmente, isso está relacionado a um sshtempo limite, como parece acontecer com arquivos grandes (r). Além disso, continuo recebendo tempos limite usando o WinSCP. Isso está acontecendo apenas comigo; várias das pessoas com quem trabalho que usam este servidor não têm o mesmo problema.

Usando rsyncde um terminal Cygwin no Windows 7, em um servidor Centos 6.3.

Não sei ao certo que outras informações podem ser úteis ou como obtê-las. Vou atualizar a pergunta ou adicionar comentários conforme as sugestões.

Como devo resolver isso?

Muito obrigado!

Juan Carlos Coto
fonte

Respostas:

12

Não sei ao certo o que pode causar o corrupt packetproblema que interrompe sua conexão, mas você pode achar o rsync --partialou a --partial-diropção útil ao transferir arquivos grandes. Assim, ao reiniciar a transferência, ela continuará onde a transferência parou, em vez de começar a transferir novamente o arquivo. arquivo inteiro novamente:

--partial-dir = .rsync-parcial

Então você pode modificar seu comando original assim:

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

Observe que, neste exemplo, removi a opção -q( --quiet) e adicionei a --progressopção no primeiro exemplo e --partial-dir=.rsync-partialno segundo exemplo.

A diferença entre --partiale --partial-dir=.rsync-partialé que, posteriormente, cria um diretório que mantém os arquivos parciais separados dos arquivos totalmente transferidos, se isso for importante para você no lado receptor (servidor).

A página de manual do rsync explicará isso com mais detalhes, embora também aponte uma nota de segurança importante na página de manual:

IMPORTANTE: o --partial-dir não deve ser gravável por outros usuários ou é um risco à segurança. Por exemplo, EVITE "/ tmp".

aculich
fonte
Eu tentei as duas opções e nem corrigi o problema. Obrigado pela dica, no entanto.
Juan Carlos Coto
1

A corrupção sugere um NIC ou driver de NIC ruim na sua máquina; tive isso uma vez na caixa do Windows da minha esposa: tive que tentar repetidamente instalar o rsync. Quando isso acontecesse, eu poderia invocar o rsync repetidamente para transferir e corrigir o outro software necessário, o que incluía principalmente drivers de NIC atualizados e uma ferramenta de soma de verificação.

Phil P
fonte
0

Se o valor ulimit for 0 ou um pequeno número, ele deve estar dando esse erro. Tente aumentar o valor ulimit (such as 9999999999)e tente novamente. você pode escrever um pequeno script de shell (a.sh)e usar algo como isto:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/
COA
fonte
1
Isso é interessante. Eu não trabalho nisso há um tempo; no entanto, se você gostaria de explicar por que funciona, acho que seria realmente útil para quem lê essa pergunta. Obrigado!
Juan Carlos Coto
-1

basta fazer um loop até transferir finalmente

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ [email protected]:/dest/; do sleep 5;done
Conjunto de ferramentas
fonte