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

9

Tentando atualizar arquivos em um servidor, com o comando rsync :

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]

Isso provavelmente está relacionado a um tempo limite ssh , 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 com esse servidor não têm o mesmo problema.

Usando rsync de um terminal Cygwin no Windows 7, contra um servidor Centos 6.3.

Não sei quais outras informações podem ser úteis ou como obtê-las. Eu atualizarei a questão ou adicionarei comentários conforme as sugestões.

Como devo resolver isso?

Muito obrigado!

    
por Juan Carlos Coto 29.01.2014 / 20:46

4 respostas

9

Não sei ao certo o que pode causar o problema corrupt packet que interrompe sua conexão, mas você pode achar útil a opção --partial ou --partial-dir do rsync ao transferir arquivos grandes para que quando você reiniciar a transferência continue onde a transferência foi interrompida em vez de ter que recomeçar a transferência do arquivo inteiro:

- partial-dir = .rsync-partial

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, eu removi a opção -q ( --quiet ) e adicionei a opção --progress no primeiro exemplo e --partial-dir=.rsync-partial no segundo exemplo.

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

A página do manual do rsync explicará isso com mais detalhes, embora eu também indique um importante nota de segurança da página de manual:

IMPORTANT: the --partial-dir should not be writable by other users or it is a security risk. E.g. AVOID "/tmp".

    
por 31.01.2014 / 01:21
1

A corrupção sugere um driver NIC ou NIC inválido em sua máquina; tive isso uma vez na caixa do Windows da minha esposa: tive que repetidamente tentar obter o rsync instalado. Uma vez que isso fosse bem-sucedido, eu poderia invocar repetidamente o rsync para transferir e consertar o outro software necessário, que incluía os drivers de NIC atualizados e uma ferramenta de soma de verificação.

    
por 31.01.2014 / 06:54
0

Se o valor ulimit for 0 ou um pequeno número, deve ser fornecido    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    assim:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/
    
por 30.04.2015 / 23:40
0

apenas loop até que finalmente seja transferido

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ [email protected]:/dest/; do sleep 5;done
    
por 18.11.2017 / 12:16