rsync expirou

4

Eu preciso sincronizar um diretório para um diretório em um servidor remoto. no momento eu uso rsync -ca para fazer isso, mas o diretório é muito grande e todo o processo falha com um erro de tempo limite.

Agora, estou procurando um arquivo por sincronização de arquivos em vez de uma abordagem "de uma só vez". como find e para cada rsync encontrado para o servidor. Qual seria a maneira mais fácil de fazer isso?

Eu recebo o seguinte erro:

receiving incremental file list
Write failed: Broken pipe
rsync: connection unexpectedly closed (1175057 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601)[receiver=3.0.7]
rsync: connection unexpectedly closed (287 bytes received so far) [generator]
rsync error: unexplained error (code 255) at io.c(601) [generator=3.0.7]
    
por k.mooijman 22.03.2013 / 09:23

4 respostas

4

Parece que o servidor atinge o tempo limite no nível de conexão SSH.

Então, adicionei essas configurações:

KeepAlive yes
ServerAliveInterval 20
ServerAliveCountMax 6

para o /etc/ssh/ssh_config (ou ~/.ssh/config ) e agora parece promissor.

    
por 22.03.2013 / 17:24
2

Atualização: Como o tempo limite parece acontecer quando o rsync está criando as somas de verificação, aqui estão algumas abordagens diferentes que podem funcionar.

Primeiro, para manter apenas um rsync aberto, você pode (além das opções mencionadas por Michael Kjörling) brincar com a opção --sockopts . Isso lhe dá a capacidade de definir o mesmo tipo de opções de soquete que você pode definir ao criar um soquete no código, por exemplo, SO_RCVTIMEOUT=0 para desativar os tempos limite para receber dados.

Em segundo lugar, a opção --progress-file pode ser suficiente para não acionar o tempo limite, enviando continuamente informações de progresso

Em terceiro lugar, você pode fazer uma sincronização arquivo por arquivo, por exemplo, assim:

for i in ls /path/to/dir; do rsync -ca $i remoteserver:/path/to/dir; done

Em quarto lugar, você poderia usar o ssh como seu mecanismo de transferência e usar suas opções TCPKeepAlive e ServerAliveInterval / ServerAliveCountMax de alguma maneira adequada para manter a conexão ativa.

Resposta original: O rsync já faz uma abordagem arquivo por arquivo - ele verificará cada arquivo na lista de arquivos a serem sincronizados e sincronizará apenas aqueles que não existirem no sistema de destino ou que sejam diferente daqueles arquivos no sistema de destino.

O que você pode fazer para reduzir o tempo de transferência é usar a opção -z que será compactada durante o transporte e a sinalização --partial para que, se a transferência for interrompida, você mantenha qualquer arquivo parcialmente sincronizado para que o rsync pode continuar onde estava. Também as opções --timeout e --contimeout que Michael Kjörling mencionou provavelmente seriam úteis.

    
por 22.03.2013 / 10:59
1

Talvez algo assim?

find . -type f -exec 'rsync' '{}' ';'

Isso executará o rsync uma vez para cada arquivo regular no diretório atual, passando o nome do arquivo (representado pelo {} token) como um parâmetro de linha de comando.

Se você tiver links simbólicos, arquivos de dispositivos, etc. no diretório em questão, tente inverter a lógica:

find . -not -type f -exec 'rsync' '{}' ';'

Isso deve "funcionar", no sentido de fazer o que você está pedindo (iniciando o rsync uma vez por arquivo). Mas tenho a sensação de que você está indo pelo caminho errado.

A página man do rsync lista --timeout (tempo limite de E / S) e --contimeout (tempo limite de conexão), e isso é apenas do grepping para timeout . Você já pensou em usá-los?

    
por 22.03.2013 / 10:26
0

Para mim, isso continuou acontecendo na retomada de uma grande transferência de rsync em uma conexão um pouco lenta. Eu estava usando o rsyncd para evitar todos os problemas com o ssh.

Descobri que a ativação da compactação ( -z ou --compress ) corrigiu o problema. Transferência recomeçada quase imediatamente.

    
por 15.12.2013 / 22:51

Tags