Estou usando rsync
para 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 rsync
inicia 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 kerberos
para autenticar no servidor remoto.
Eu tentei várias combinações com ServerAliveInterval
, ServerAliveCountMax
ou ClientAliveInterval
no meu ~/.ssh/config
, mas sem sucesso.
Pode ser que exista algo em execução no servidor que mate o rsync
comando por algum motivo, mas não sei como investigar isso. Alguma ideia?
fonte
kerberos
para autenticar no servidor remoto.Respostas:
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:
Se isso também falhar após alguns minutos, não será memória.
fonte
Eu já encontrei isso
rsync
no passado também. A solução que o corrigiu foi executá-lo em umascreen
sessão, capaz de ajudar a manter a conexão com o servidor remoto.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
screen
em segundo plano de uma só vez, fazendo [alguém por favor me corrija se eu estiver errado]screen -dm 'command'
. Você pode quererman screen
antes de tentar o último.EDITAR:
Estou editando minha resposta porque você confirmou que
screen
não fornece assistência nesse cenário, mas você respondeu ao meu comentário sugerindo tentarscp
ver 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
- oussh
(comtar
) - em vez dersync
Concedido,
scp
não suporta o grande número de recursos comorsync
, mas você realmente se surpreender ao descobrir quantos recursos que ele faz suporte que são quase idênticos ao dorsync
.Cenários do mundo real
scp
e outras alternativas pararsync
: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
rsync
em nossos servidores, criei uma solução alternativa usando oscp
que também funcionava.Dito isto, modifiquei recentemente o script para que tudo o que ele usa seja
ssh
etar
-GNU tar
/gtar
, para ser exato. GNUtar
suporta muitas das opções que você vai realmente encontrar emrsync
, como--include
,--exclude
, permissão / preservação atributo, compressão, etc.A maneira como eu faço isso agora é
ssh
acessando o servidor remoto (via pubkey auth) e usandogtar -czf - [other options such as --include='*.log' and --exclude='*core*', etc.]
- isso grava todas as informações emstdout
, que são canalizadas [localmente] paratar -xzf
que 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 pararsync
, neste caso. A única coisa importante,tar
nem oscp
suporte, são backups incrementais e o nível de erro no nível de bloco que verifica essesrsync
recursos.O comando completo ao qual estou me referindo ao usar
ssh
etar
seria algo assim (remoto é Solaris 10; local é Debian, pelo que vale a pena):No seu cenário, seria o contrário -
tar -cf -
localmente e canalizar para o servidor remoto viassh 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
tar
seria inútil, mas na verdade acelera um pouco as coisas, assim como usar o-C
sinalizador withssh
para ativar assh
compactaçã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 usarscreen
se você estiver fazendo um backup que levará algum tempo. Caso contrário, verifique se as configurações de keepalive / timeoutssh_config
estã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 usarscreen
outmux
ao 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
rsync
problema. No entanto, se isso for realmente importante, existem duas ótimas soluções alternativas que você pode experimentar enquanto isso.fonte
screen
, o resultado é o mesmo.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.
fonte
rsync 3.1.1
.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:
E no cliente
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.
fonte
netcat
em qualquer porta> 1024 sem a necessidade de privilégios de rootVocê tem algo no servidor remoto que grava no stdout . Isso pode estar no seu
.profile
ou.bash_profile
. Poderia ser algo menos óbvio comostty
oumesg
. 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).fonte
.profile
ou.bash_profile
para revisão. Você está procurando coisas comomesg
oustty
mesg
oustty
em qualquer um dos meus dotfiles.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.
fonte
Eu encontrei um problema semelhante ao executar
rsync
ou manualmente (ou comcp
,scp
ou 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ãokerberos
na minha configuração). As unidades NAS são compartilhadas usandosamba
e montadas no cliente usandocifs
. 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 ):Alternativamente, quando montar a unidade NAS no cliente usando
gvfs
emnautilus
este problema não persistiria ao copiar arquivos grandes (mas que não funciona em combinação comrsync
embora).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.
fonte
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 .
fonte