o rsync continua desconectando: tubo quebrado

14

Estou usando rsyncpara fazer backup do meu diretório pessoal. Isso está funcionando bem há muito tempo. Aqui está o comando que estou usando:

rsync \
    -pavz \
    --delete \
    --exclude 'mnt/' \
    --exclude '.cache/' \
    --exclude 'Videos/' \
    --exclude 'Music/' \
    --exclude 'Documents/virtualbox' \
    /home/"${USER}" "${server}":"${dir}" 2>> "${errorFile}"

No entanto, mudei o servidor para o qual estou fazendo backup e agora rsyncinicia e executa por alguns segundos (até alguns minutos), mas depois para com a mensagem de erro

packet_write_wait: Connection to x.x.x.x: Broken pipe
rsync: [sender] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(820) [sender=3.1.1]

Como está funcionando em outros servidores, suspeito que o problema seja a conexão ou o próprio servidor. A conexão parece estar estável. Estou conectado via cabo e não vejo interrupções. Também tentei executar ping no servidor enquanto fazia o backup. O ping tem uma taxa de resposta de 100%, mesmo quando o backup está sendo interrompido.

Eu uso kerberospara autenticar no servidor remoto.

Eu tentei várias combinações com ServerAliveInterval, ServerAliveCountMaxou ClientAliveIntervalno meu ~/.ssh/config, mas sem sucesso.

Pode ser que exista algo em execução no servidor que mate o rsynccomando por algum motivo, mas não sei como investigar isso. Alguma ideia?

pfnuesel
fonte
Talvez eu deva acrescentar que uso kerberospara autenticar no servidor remoto.
pfnuesel
Isso é potencialmente muito importante. Por favor edite sua pergunta para incluir esta informação
roaima
Nesse servidor, a chamada para rsync falha todas as vezes ou apenas algumas vezes? Além disso, se medir repetidamente o tempo que leva para falhar, algum padrão aparece? Estou pensando no tempo limite da autenticação Kerberos, ou algo semelhante.
dhag
ver um erro io me faz pensar se o sistema de arquivos do lado remoto foi preenchido?
Jeff Schaller
1
@rubynorails Interessante. Isso parece funcionar sem problemas.
pfnuesel

Respostas:

6

Seu problema pode ser (falta de) memória. Quando 1 GB era grande para um servidor, o rsync falharia em mim para grandes conjuntos de dados. Talvez o algoritmo tenha melhorado as capacidades de memória, mas não vejo esse problema há oito anos. Realmente, este é um tiro de fora, mas vale a pena explorar. Experimente conjuntos de dados menores primeiro. Você também pode tentar - como um formulário na verificação de sanidade - fazer um tar-tar:

tar cf - $HOME | ssh ${server} tar xf -

Se isso também falhar após alguns minutos, não será memória.

Otheus
fonte
4

Eu já encontrei isso rsyncno passado também. A solução que o corrigiu foi executá-lo em uma screensessão, capaz de ajudar a manter a conexão com o servidor remoto.

screen -LS rsync
[execute your rsync command]
Ctrl-A+D to detach from the session

Você pode verificar o status executando screen -x rsync(ou o que você decidir nomear a sessão, se você der um nome, que não é obrigatório). Isso reconectará seu shell atual a essa sessão. Lembre-se de desanexá-lo novamente depois de verificar o status para que ele continue sendo executado em segundo plano.

Você também pode executar o comando para executar screenem segundo plano de uma só vez, fazendo [alguém por favor me corrija se eu estiver errado] screen -dm 'command'. Você pode querer man screenantes de tentar o último.

EDITAR:

Estou editando minha resposta porque você confirmou que screennão fornece assistência nesse cenário, mas você respondeu ao meu comentário sugerindo tentar scpver que tipo de resultados você obtém, aos quais você respondeu que por incrível que pareça, funcionou bem.

Portanto, minha nova resposta é: use scp- ou ssh(com tar) - em vez dersync

Concedido, scpnão suporta o grande número de recursos como rsync, mas você realmente se surpreender ao descobrir quantos recursos que ele faz suporte que são quase idênticos ao do rsync.

Cenários do mundo real scpe outras alternativas para rsync:

Há algum tempo, fui incumbido de criar um script de shell que extraísse logs de nossos servidores de produção e os armazenasse localmente em um servidor Web, para que os desenvolvedores pudessem acessá-los para fins de solução de problemas. Depois de tentar, sem sucesso, fazer com que a equipe do Unix instalasse rsyncem nossos servidores, criei uma solução alternativa usando o scpque também funcionava.

Dito isto, modifiquei recentemente o script para que tudo o que ele usa seja sshe tar- GNU tar/ gtar, para ser exato. GNU tarsuporta muitas das opções que você vai realmente encontrar em rsync, como --include, --exclude, permissão / preservação atributo, compressão, etc.

A maneira como eu faço isso agora é sshacessando o servidor remoto (via pubkey auth) e usando gtar -czf - [other options such as --include='*.log' and --exclude='*core*', etc.]- isso grava todas as informações em stdout, que são canalizadas [localmente] para tar -xzfque nenhuma alteração seja feita no servidor de produção remoto e todos os arquivos puxados como estão no servidor local. É uma ótima alternativa para rsync, neste caso. A única coisa importante, tarnem o scpsuporte, são backups incrementais e o nível de erro no nível de bloco que verifica esses rsyncrecursos.

O comando completo ao qual estou me referindo ao usar sshe tarseria algo assim (remoto é Solaris 10; local é Debian, pelo que vale a pena):

cd /var/www/remotelogs
ssh -C user@remotehost "cd /path/to/remote/app.directories; gtar -czf - --include='*.log' --exclude='*.pid' --exlude='*core*' *" | tar -xz

No seu cenário, seria o contrário - tar -cf -localmente e canalizar para o servidor remoto via ssh user@remotehost "tar -xf -"- existe outra resposta que faz referência a esse tipo de comportamento, mas não entra em muitos detalhes.

Existem algumas outras opções que incluí para acelerar as coisas. Cronometrei tudo incansavelmente para obter o tempo de execução o mais baixo possível. Você pensaria que usar a compressão com tarseria inútil, mas na verdade acelera um pouco as coisas, assim como usar o -Csinalizador with sshpara ativar a sshcompactação também. Posso atualizar esta postagem posteriormente para incluir o comando exato que uso (que é muito semelhante ao que publiquei), mas não sinto vontade de entrar na VPN no momento desde que estou de férias nesta semana.

No Solaris 10, eu também uso -c blowfish, porque é a cifra mais rápida para se autenticar e também ajuda a acelerar um pouco, mas o nosso Solaris 11 não o suporta ou tem esse conjunto de cifras desativado.

Além disso, se você optar por ir com a opção ssh/ tar, seria realmente uma boa ideia implementar minha solução original de usar screense você estiver fazendo um backup que levará algum tempo. Caso contrário, verifique se as configurações de keepalive / timeout ssh_configestão ajustadas corretamente, ou esse método também provavelmente causará um cano quebrado.

Mesmo se você continuar scp, sempre acho que é uma prática recomendada usar screenou tmuxao executar uma operação desse tipo, apenas por precaução . Muitas vezes eu não sigo o meu próprio conselho e falho em fazer isso, mas é realmente uma boa prática usar uma dessas ferramentas para garantir que o trabalho remoto não estrague por causa de sua sessão do shell ativa ser desconectada de alguma forma.

Sei que você deseja descobrir a causa raiz do seu rsyncproblema. No entanto, se isso for realmente importante, existem duas ótimas soluções alternativas que você pode experimentar enquanto isso.

rubynorails
fonte
1
Eu tentei com screen, o resultado é o mesmo.
Pfnuesel
@pfnuesel - pelo menos é bom saber que você pode descartar isso.
rubynorails
3

Eu estava tendo o mesmo problema no OSX El Capitan e resolvi isso atualizando para o rsync v3.11. O problema estava acontecendo para mim na v2.6.9.

Bruno
fonte
Estou correndo rsync 3.1.1.
Pfnuesel 02/12/2015
Convém verificar se o roteador não possui a proteção contra inundação de pacotes (ou qualquer proteção semelhante) ativada. Você está se conectando através de algum tipo de VPN?
de Bruno
Esse pode ser o problema. Infelizmente, não tenho acesso aos dispositivos de rede. Porém, ele funciona bem em outros servidores, então acho que esse servidor em particular tem algum tipo de proteção contra inundação de pacotes.
Pfnuesel 03/12
2

O Kerberos é apenas para autenticação, que não deve causar problemas após a criação de uma conexão bem-sucedida.

Você já tentou usar o daemon rsync também?

Seus servidores estão na mesma rede ou você possui um firewall / roteador?

Você pode tentar configurar uma sessão netcat entre os servidores, que é uma maneira simples de tentar se você tiver algum problema de conexão entre os servidores.

No primeiro servidor:

nc -lk <port-number>

E no cliente

nc <server> <port-number>

Você pode deixar a conexão aberta e ver se a conexão a mantém ou se você a perde. Você também pode tentar escrever algo no cliente, ver se acaba do outro lado.

toed
fonte
Infelizmente, não tenho acesso root no servidor. Isso significa que não consigo executar um daemon rsync ou uma sessão netcat.
pfnuesel
@pfnusel você pode executar netcatem qualquer porta> 1024 sem a necessidade de privilégios de root
roaima
1

Você tem algo no servidor remoto que grava no stdout . Isso pode estar no seu .profileou .bash_profile. Poderia ser algo menos óbvio como sttyou mesg. Em caso de dúvida, copie uma transcrição para sua pergunta de fazer login no servidor (redija o nome do host por todos os meios).

roaima
fonte
Eu não entendo Nem o que está errado, nem o que devo fazer para descobrir o que está escrevendo no stdout.
pfnuesel
@pfnuesel Se você copiar a transcrição do seu login e publicá-la aqui, alguém poderá ver o que está acontecendo. Melhor, publique seu .profileou .bash_profilepara revisão. Você está procurando coisas como mesgoustty
roaima 25/11/2015
Há nenhum mesgou sttyem qualquer um dos meus dotfiles.
Pfnuesel
@pfnuesel mais alguma coisa que escreve no terminal durante o login?
roaima
Não, mas mesmo se eu adicionar algo que grave no stdout. Isso não muda nada.
Pfnuesel
1

Na única vez em que tive um problema como esse com o rsync, localizei-o em uma porta Ethernet sobressalente em outra máquina que tinha o mesmo endereço IP do meu servidor de destino. Se o rsync é esquisito, é quase certamente um problema de confiabilidade da rede ou (no meu caso) de configuração.

Nathan Siemers
fonte
1

Eu encontrei um problema semelhante ao executar rsyncou manualmente (ou com cp, scpou no Gnome Nautilus) copiar grandes arquivos de um desktop Linux a um ARM de baixa potência com base Linux NAS através de uma rede gigabit com cabo (não kerberosna minha configuração). As unidades NAS são compartilhadas usando sambae montadas no cliente usando cifs. A solução para mim foi montar o sistema de arquivos NAS do cliente sem nenhum cache (consulte também as páginas de manual mount.cifs ):

sudo mount -t cifs //server.lan/somedir /mnt/somedir/ -o cache=none

Alternativamente, quando montar a unidade NAS no cliente usando gvfsem nautiluseste problema não persistiria ao copiar arquivos grandes (mas que não funciona em combinação com rsyncembora).

Faça com que o Linux grave no sistema de arquivos da rede simultaneamente com as leituras de disco local e explique mais detalhadamente por que esse problema pode estar ocorrendo.

davidovitch
fonte
0

Basta atualizar as versões do rsync para garantir que sejam exatamente iguais nos PCs de envio e recebimento. Veja minha resposta aqui: /server/883487/unable-to-rsync-due-to-broken-pipe/988794#988794 .

Gabriel Staples
fonte
1
Por que o voto negativo? Este deve ser um comentário, não uma resposta, talvez? Qualquer um? Qualquer um?
Gabriel Staples
1
Não consigo mais reproduzir o problema, pois não tenho mais acesso a esse servidor. Mas é uma resposta razoável e não merece o voto negativo.
Pfnuesel 23/10/19