rsync - atualiza a lista de sincronização enquanto o rsync está em execução

0

Eu tenho um grande trabalho de computação em execução em uma máquina remota que gera ~ 40 arquivos de dados a cada ~ 20 minutos. Eu gostaria de puxar os arquivos gerados da máquina remota para a minha máquina local assim que eles são gerados, e imediatamente excluí-los da máquina remota.

Eu consegui fazer parte do caminho usando rsync --remove-source files user@remote:~/datadir/* ./localdir . No entanto, isso não executa rsync "ao vivo", ou seja, se novos arquivos forem adicionados a datadir , preciso executar novamente o rsync .

No meu entender, rsync primeiro cria uma lista de arquivos para copiar e, em seguida, passa pela lista um por um. Eu estou querendo saber, existe uma maneira de atualizar a lista como novos arquivos são adicionados ao datadir , ou alguma outra maneira de mover arquivos da máquina remota para local assim que eles são gerados?

    
por dkv 12.05.2017 / 01:16

1 resposta

0

Bem, isso é tudo como quando você vai ao seu médico e diz "Doutor! Dói quando eu faço isso!" e ele diz "Então não faça isso! Problema resolvido!".

rsync é para sincronizar diretórios, mas, a partir de sua descrição, você não quer fazer isso. Você quer "não sincronizar" dois diretórios: você quer que os arquivos estejam em um, mas não em ambos.

Eu entendo que você não pode modificar o código que gera os arquivos no outro sistema, pois, se você pudesse, você simplesmente o executaria ftp ou rcp ou curl ou alguns, assim que os arquivos terminarem, para empurrá-los para a máquina de destino a partir da máquina de origem e, em seguida, excluí-los.

Portanto, trabalhando apenas na máquina de destino, é melhor executar uma tarefa periódica para conectar-se à máquina remota e copiar e excluir tudo em ~ / datadir . Isso vai economizar a sobrecarga do rsync de comparar os dois diretórios: sendo um esforço desperdiçado, já que você não se importa com o conteúdo de ./ localdir - sempre vai obter o conteúdo de ~ / datadir puxado para ele. Usar rcp ou scp é o mais simples, mas se o único acesso que você tiver no sistema remoto for rsync , execute isso em um cron trabalho .

Isso causará um atraso entre a criação do arquivo e o transporte de alguns minutos, dependendo da periodicidade do seu trabalho, já que, como você observou, o rsync não é executado ao vivo . Se você precisar de transporte imediato, precisará executar um servidor de compartilhamento de arquivos como amule na outra máquina, mas isso é muito complexo e sobrecarregado para economizar alguns minutos e você ainda teria que assinar de vez em quando para excluir os arquivos: algo que nenhum utilitário de compartilhamento de arquivos fará por você.

Em tudo isso, há o gremlin à espreita de Como você sabe que tem arquivos completos e não corrompidos esperando por você do outro lado?

Se você está apenas pegando coisas do diretório em que os arquivos são criados, qualquer número de coisas pode resultar em levar uma fração de um arquivo completo para a máquina de destino. Você poderia, por exemplo, iniciar a cópia (ou rsync ou qualquer outro) enquanto o arquivo está sendo gravado pelo código na máquina de origem. Ou o programa de criação pode simplesmente cair devido a algum problema de hardware, como um disco inteiro, no meio da criação.

Então, ao fazer esse tipo de coisa, eu sempre tenho diretórios separados de criação e transporte e, em seguida, arquivos mv ( não cp ) após a criação bem-sucedida da criação ao diretório de transporte. Eu sou muito paranóico sobre corrupção de arquivos também, então eu sempre cozinho meu próprio arquivo digest / checksum / manifest para os arquivos de origem, bem como sobre todas as coisas automáticas de baixo nível que protegem contra a corrupção.

    
por 12.05.2017 / 10:40