A cópia de arquivo remoto * mais robusta *?

6

Como eu iria copiar arquivos em uma conexão de internet muito instável?

Às vezes, a conexão é perdida, outras vezes o IP de uma máquina ou da outra máquina é alterado, às vezes ambos, embora o DNS dinâmico detecte isso.

Qual ferramenta ou comando você sugeriria?

Ouvi dizer que rsync é bastante bacana em copiar apenas o diff, mas isso significa muito trabalho, seja reiniciando-o de novo e de novo ou colocando-o em um tempo ou em um cronjob.

Eu estava esperando por algo mais fácil e infalível.

Adendo:

Trata-se de copiar de vez em quando alguns diretórios com alguns arquivos muito grandes > 5 GB neles de um site para outro. Após a cópia, ambos são movidos localmente para locais diferentes.

Eu não posso fazer nada no nível de rede, eu não teria conhecimento para fazer isso.

Eu prefiro não configurar um servidor web para usar o wget. Isso não é seguro e parece uma rota tortuosa.

Eu já estabeleci uma conexão SSH e poderia agora rsync, como o rsync já está instalado em ambas as máquinas (eu não seria capaz de obter um daemon rsync instalado e funcionando).

Alguma dica de como eu poderia fazer um rsync inteligente sobre ssh para que ele continue quando a linha for temporariamente cortada? Mas o rsync não será o problema quando a conexão ssh morrer. Então, algo assim ( link ) provavelmente não funcionará:

while ! rsync -a .... ; do sleep 5 ; done

Alguma idéia?

Muito obrigado!

Gary

    
por Gary Czychi 31.07.2014 / 22:06

4 respostas

2

OK, encontrei a solução no meu caso. Eu estou realmente usando o while loop sugerido. Agora parece com isso:

while ! \
rsync -aiizP --append --stats . -e ssh [email protected]:./path/rfiles ; \
do now=$(date +"%T") ; echo · Error at $now · ; sleep 5 ; done

Sem o loop while, eu teria que iniciar manualmente o rsync novamente. Agora funciona como um encanto.

O interessante é: recebo o erro exatamente dez minutos após a perda da conexão e cerca de 9 minutos depois que a conexão está funcionando novamente! Enquanto isso, nada está acontecendo na janela do terminal. Gostaria de saber de onde vem esse tempo limite de 10 minutos.

Muito obrigado pela sua ajuda.

Gary

FYI: Este é o erro de tempo limite que recebo (10 minutos após o fato):

...
thedirectory/afile.ext
Read from remote host myhost.com: Operation timed out
rsync: writefd_unbuffered failed to write 16385 bytes [sender]: Broken pipe (32)
rsync: connection unexpectedly closed (394 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-40/rsync/io.c(452) [sender=2.6.9]
    
por 04.08.2014 / 04:31
3

Eu definitivamente sugiro rsync . Eu uso rsync para copiar arquivos sempre que achar que a conexão tem alguma possibilidade de ser interrompida. Se a cópia falhar, sei que posso simplesmente iniciá-la novamente.

É fácil colocá-lo em um loop while se você precisar reiniciá-lo automaticamente até conseguir.

    
por 31.07.2014 / 22:17
3

O principal problema com o rsync é que ele não pode continuar com arquivos induviduais. Se você estiver copiando uma estrutura de diretórios complexa, tudo bem, mas se você quiser copiar, por exemplo, uma única imagem de dvd, ela não será robusta.

Para tais casos eu uso o wget. Mais precisamente,

wget -c -t 0 -T 10 http://....

Especialmente interessante é o tempo limite de 20 segundos, que resolve o problema comum de que nossas ferramentas estão efetivamente bloqueadas / congeladas porque um único pacote perdido.

Claro que precisa de um servidor http no lado da fonte. Se é impraticável, existe uma ferramenta chamada

split

que pode dividir arquivos grandes para menores e, em seguida, usar para eles o rsync. Os arquivos divididos podem ser posteriormente reunidos com um simples gato.

Claro que você pode rodar o rsync mesmo em um loop até conseguir:

while ! rsync ...; do echo next try; done

Extensão após um comentário

rsync pode continuar arquivos, com o sinalizador -partial . Obrigado @GregHewgill! : -)

    
por 31.07.2014 / 22:27
2

Se você tentar resolver este problema no nível da ferramenta de cópia de arquivos, o rsync é o melhor possível. Certifique-se de usar as opções -au , para que o rsync não tente sincronizar o mesmo arquivo várias vezes. O Rsync fará progresso desde que seja capaz de pelo menos trocar a lista de arquivos e transferir um arquivo completamente antes de ser interrompido; se você não puder garantir isso, terá problemas sem uma ferramenta no nível da rede.

Acho mais fácil (e mais natural) resolvê-lo no nível da rede: crie um túnel de rede confiável em cima de sua conexão de rede não confiável. Anos atrás eu usei Rocks para esse propósito; é não-mantido e eu não tentei compilá-lo ou usá-lo recentemente, mas não há nenhuma razão fundamental para que ele não funcione. Assista este espaço para alternativas.

    
por 01.08.2014 / 01:33