Como posso mover (rsync) uma quantidade enorme de dados de forma confiável, o que pode lidar com interrupções de rede?

4

Tenho cerca de 50 gigabytes que gostaria de mover. Eu quero fazê-lo através de TCP / IP (daí rede no título) otimizado para uma rede local. Meu problema é que a conexão ocasionalmente é interrompida e eu nunca consigo obter todos os dados de forma confiável para o seu destino. Eu gostaria disso para

  1. não desista tão facilmente
  2. continue tentando automaticamente (supondo que as duas máquinas estejam ligadas).

Minha abordagem seria usar rsync .

SOURCE=/path/to/music/ # slash excludes "music" dir
DESTINATION=/path/to/destination 
rsync \
  --archive \ # archive mode; equals -rlptgoD (no -H,-A,-X)
  --compress \ # compress file data during the transfer
  --progress \ # show progress during transfer
  --partial \ # delete any partially transferred files after interrupt, on by default but I added it for kicks
  --human-readable \ #output numbers in a human-readable format
  "$SOURCE" \
  "$DESTINATION" \

Existem outros parâmetros que devo considerar?

    
por Jonathan Komar 20.06.2017 / 11:56

1 resposta

0

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
    
por 25.06.2017 / 16:53