'rsync' durante a transmissão

0

Esta questão é essencialmente por causa da minha inexperiência usando rsync , se ele for duplicado, eu o apagarei imediatamente.

Eu tenho uma pasta local /dir-scr , sendo alimentada continuamente com dados de produção de leituras de sensores. A cada 10 minutos aprox. um arquivo com timestamp filename yyyymmddhhmmss.dat está sendo criado, preenchido de 0 a 40MB aprox. e fechado. Após 10 minutos aproximadamente, outro arquivo é criado.

Eu realizei várias execuções em lote das atualizações:

$ rsync -azvP /dir-src/* host-dst:dir-src/

Que consegue copiar e substituir arquivos parcialmente preenchidos, ou seja, copia arquivos completos com 40MB e o arquivo atual com, digamos, 25MB, e na próxima atualização, substitua o arquivo de 25MB pela versão completa por 40MB.

Atualmente, faço uma operação de movimentação manual para não excluir erroneamente qualquer arquivo que ainda não tenha sido copiado.

Agora, quero usar um dos sinalizadores rsync , como:

  • --exclude
  • --delete-excluded
  • --delete-after
  • --remove-source-files

mas não tenho certeza da operação deles.

A pergunta é, como usar rsync para mover arquivos, digamos, com mais de 10 minutos, e excluir de /dir-src se e somente se eles já estiverem em host-dst:dir-dst/ .

    
por Brethlosze 20.06.2017 / 18:46

1 resposta

2

Acredito que o uso de rsyncs embutidos nas opções de exclusão não é o caminho certo para resolver esse problema. Se você fizer algo como o seguinte:

$ rsync -azvP --remove-source-files /dir-src/* host-dst:dir-src/

você pode ficar na situação em que o rsync transfere um arquivo parcialmente preenchido e, em seguida, o exclui. Se o arquivo for recriado com o mesmo nome, o rsync sobrescreverá a cópia na máquina de destino. Assim, você perderá a primeira metade do arquivo.

Talvez você queira considerar isso. Deixe o rsync fazer sua transferência normalmente, então você pode configurar um cronjob que é executado a cada dez minutos e faz algo como isso.

$ find /dir-src -type f -mmin +15 -exec rm -f {} +

Isso localizará todos os arquivos no diretório dir-src com mais de 15 minutos e os excluirá. Estamos assumindo aqui que o tempo máximo que leva para um arquivo ser preenchido é de 15 minutos. Você pode querer ajustar esse valor para atender às suas necessidades. Além disso, durante os testes, substitua -exec rm -f {} + por -print . Isso garantirá que o find apenas pegue os arquivos que deseja excluir antes de executar qualquer operação destrutiva.

Em seu comentário, você diz que tem uma conexão de rede não confiável e teme que o rsync não seja concluído com êxito. Um método para contornar isso poderia ser o seguinte depois de criar um diretório auxiliar:

  1. A cada 15 minutos, mova todos os arquivos com mais de 15 minutos de dir-src para dir-aux .
  2. A cada 10 minutos, arquivos rsync de dir-aux a host-dst:dir-src .
  3. A cada 60 minutos, exclua todos os arquivos em dir-aux .

Isso garantirá que o rsync tenha a chance de ser executado 5-6 vezes antes que os arquivos sejam excluídos. Dependendo da sua conexão, isso provavelmente é o suficiente. Você pode dimensionar os 60 minutos para cima ou para baixo, dependendo dos resultados do seu teste.

    
por 20.06.2017 / 20:29

Tags