Como chamar repetidamente o rsync até que os arquivos sejam transferidos com êxito

27

Estou tentando sincronizar arquivos de um servidor remoto que não é confiável, o que significa que a conexão tende a falhar "aleatoriamente" com

rsync: conexão inesperadamente fechada

O Rsync é chamado com --partial, então eu gostaria de poder chamar o rsync em um loop até que os arquivos sejam totalmente transferidos. Não parece haver um sinalizador para dizer ao rsync para tentar novamente.

Qual seria a melhor maneira de escrever isso? Uma festança para loop?

Bruno Lopes
fonte
1
Embora as respostas abaixo sejam úteis, pode ser uma idéia melhor descobrir por que está falhando e fazê-lo parar. Suponho que você controla o servidor, o cliente e a rede no meio, para que você possa executar o tcpdump em vários locais para ver como foi fechado. Talvez um dos seus dispositivos de firewall ou VPN esteja fechando a conexão?
MarkR
O servidor ao qual está se conectando é um host compartilhado, portanto, não tenho acesso root. Posso analisar por que está fechando, mas por enquanto estou mais do que feliz em apenas tentar novamente. Obrigado de qualquer forma a cabeça para cima
Bruno Lopes
Fiquei chocado ao descobrir que o rsync não tinha a capacidade de tentar novamente!
Michael
rsync --partial --append tem a capacidade de tentar novamente, manualmente ou em um script, verificando o código de retorno. Duplicado de: superuser.com/questions/302842/…
rickfoosusa

Respostas:

29

Se você estiver sincronizando tudo em uma sincronização, chame o rsync em um loop até o rsync fornecer um código de retorno bem-sucedido.

Algo como:

RC=1 
while [[ $RC -ne 0 ]]
do
   rsync -a .....   
   RC=$?
done

Isso fará um loop, chamando rsync, até que ele forneça um código de retorno 0. Você pode adicionar um sono lá para impedir a DOSagem do servidor.

David
fonte
28
você pode apenas escrever enquanto! rsync -a ....; durma 5; pronto
Justin
1
apenas tenha cuidado ao usar isso, por exemplo, se você tentar executá-lo via cron, poderá encontrar problemas de simultaneidade.
Keiran Holloway
3
Isso se transformará em um loop infinito se houver um erro não transitório (por exemplo, um erro de permissão ao ler ou gravar arquivos). Eu recomendo verificar o status de saída do rsync em busca de erros de rede específicos, algo como RC=12; while [[ $RC -eq 12 || $RC -eq 30 ]](ou qualquer status de saída que você esteja vendo das quedas na rede).
Gordon Davisson
1
Como não estou executando isso (completamente) autônoma, loops infinitos e simultaneidade não são um problema, obrigado.
Bruno Lopes
2
É uma pena que o rsync não tenha esse recurso embutido, porque qualquer tipo de loop baseado em shell solicitará uma senha nos casos em que a autenticação automática não estiver disponível ou apropriada.
Michael
1

purtting tudo junto com sshpass

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
Conjunto de ferramentas
fonte