Parâmetros do Rsync
Parece que meus parâmetros rsync
estão bem.
Eu tive que adicionar um parâmetro para lidar com arquivos que existem após uma falha de conexão. As opções foram --ignore-existing
ou --update
para evitar reescrever as coisas já escritas. Eu ainda não tenho certeza qual é o melhor (talvez alguém saiba), mas neste caso eu fui com --update
depois de ler este link
Compare:
- - atualiza arquivos ignorados que são mais recentes no receptor
- - ignore-existente ignore os arquivos de atualização que já existem no receptor
Interrupções de conexão
O enigma do problema de conexão (wifi flaky etc.) foi resolvido chamando-se continuamente rsync quando um código de saída não é zero, forçando, assim, meu processo a continuar até que a transferência seja um sucesso. (a menos que eu corte a energia, um raio atinge minhas linhas de energia, ou eu mato usando um sinal)
Para lidar com desconexões de rede, usei um loop while
.
while [ 1 ]
do
# STUFF
done
while [ 1 ]
tem uma ressalva: usar um sinal como ctrl c para uma interrupção (SIGINT) não funcionará, a menos que você adicione uma verificação explícita para qualquer código de saída acima de 128 que chame break
.
if [ "$?" -gt 128 ] ; then break
então você pode verificar o código de saída do rsync. Zero significa que todos os arquivos foram movidos.
elif [ "$?" -eq 0 ] ; then exit
Caso contrário, a transferência não está completa.
else sleep 5
Exemplo de script sync-music.sh
O script rsync pressupõe a autenticação por chave ssh sem senha.
#!/bin/bash
SOURCE="/path/to/Music/"
DESTINATION="[email protected]:/media/Music"
while [ 1 ]
do
rsync -e 'ssh -p22'\
--archive \
--compress \
--progress \
--partial \
--update \
--human-readable \
"$SOURCE" \
"$DESTINATION"
if [ "$?" -gt 128 ] ; then
echo "SIGINT detected. Breaking while loop and exiting."
break
elif [ "$?" -eq 0 ] ; then
echo "rsync completed normally"
exit
else
echo "rsync failure. reestablishing connection after 5 seconds"
sleep 5
fi
done