O segundo exemplo lê os dados em lote via entrada padrão, para que o arquivo em lotes não precise ser copiado primeiro na máquina remota. Este exemplo evita o script foo.sh porque precisava usar uma opção --read-batch modificada, mas você poderia editar o arquivo de script se desejasse utilizá-lo (apenas certifique-se de que nenhuma outra opção esteja tentando usar o padrão entrada, como a opção "--exclude-from = -").
Ressalvas:
A opção de leitura em lote espera que a árvore de destino que está sendo atualizada seja idêntica à árvore de destino usada para criar o conjunto de arquivos de atualização em lote. Quando é encontrada uma diferença entre as árvores de destino, a atualização pode ser descartada com um aviso (se o arquivo já estiver atualizado) ou a atualização do arquivo pode ser tentada e, em seguida, se o arquivo falhar na verificação , a atualização descartada com um erro. Isso significa que deve ser seguro executar novamente uma operação de lote de leitura se o comando for interrompido. Se você deseja forçar a tentativa de atualização em lote sempre, independentemente do tamanho e data do arquivo, use a opção -I (ao ler o lote). Se ocorrer um erro, a árvore de destino provavelmente estará em um estado parcialmente atualizado. Nesse caso,
A versão rsync usada em todos os destinos deve ser pelo menos tão nova quanto a usada para gerar o arquivo em lotes. O Rsync sofrerá um erro se a versão do protocolo no arquivo em lotes for muito nova para o rsync de leitura em lote. Consulte também a opção --protocol para obter uma maneira de fazer com que o rsync criado gere um arquivo em lotes que um rsync mais antigo possa entender. (Observe que os arquivos em lote foram alterados na versão 2.6.3, portanto, misturar versões anteriores a versões novas não funcionará.)
Ao ler um arquivo em lotes, o rsync forçará o valor de certas opções a corresponderem aos dados no arquivo em lotes, se você não os definir para o mesmo que o comando de gravação em lote. Outras opções podem (e devem) ser alteradas. Por exemplo, as alterações --write-batch para --read-batch, --files-from são descartadas e as opções --filter / - include / - exclude não são necessárias, a menos que uma das opções --delete seja especificada .
O código que cria o arquivo BATCH.sh transforma qualquer opção de filtro / inclusão / exclusão em uma única lista que é anexada como um documento "aqui" ao arquivo de script do shell. Um usuário avançado pode usar isso para modificar a lista de exclusões, se desejar uma alteração no que é excluído por --delete. Um usuário normal pode ignorar esses detalhes e apenas usar o script de shell como uma maneira fácil de executar o comando --read-batch apropriado para os dados em lote.
O modo de lote original no rsync foi baseado em "rsync +", mas a versão mais recente usa uma nova implementação.
remote destination is not allowed with --read-batch
-
para um nome de arquivo significa ler da entrada padrão e STDIN também está sendo lidofoo
no exemplo, um arquivo local.Você pode tentar usar o uníssono . Deve ser muito mais rápido na criação da lista de arquivos, pois mantém um cache dos arquivos.
fonte
O
rsync
--batch-mode
suporta multicast. Se isso for possível na sua rede, pode valer a pena investigar isso.fonte
que tal mudar sistemas de arquivos?
Há algum tempo, mudei um FS com vários terabytes do ext3 para o XFS. O tempo para verificar os diretórios (com cerca de 600.000 arquivos da última vez que verifiquei) passou de 15 a 17 minutos para menos de 30 segundos!
fonte
Não é uma resposta direta, mas se você usar o rsync versão 3+, ele começará a ser transferido antes de gerar toda a lista de arquivos.
Outra opção, ainda não muito eficiente, seria executá-los como trabalhos, para que alguns sejam executados ao mesmo tempo.
Além disso, eu pensei nessa estranheza se você não se importa em usar tar:
Onde cada host local seria servidores diferentes, é claro (assume o login baseado em chave). Nunca usei o acima antes, no entanto.
fonte
Que tal executar os trabalhos rsync do host1, host2 e host3? Ou, execute um trabalho para copiar para o host1 e execute-o no host2 e host3 para obtê-lo do host1.
fonte
Uma solução melhor seria criar um repositório com o git e enviar para os 3 hosts. Mais rápido, você não precisaria da parte da lista de arquivos e ela consome menos recursos.
Boa sorte,
João Miguel Neves
fonte
.git/
embora os envios para os controles remotos que já teriam a maioria dos dados fossem mais rápidos. O git não substitui o rsync.http
,nfs
eafp
. O GitHub é um site que cuida da criação e manutenção de repositórios git para você e os torna públicos (a menos que você pague).Ao procurar essa resposta, acho que você precisaria fazer um lote usando o rsync primeiro e depois enviá-lo a todos, o que tornaria a lista de arquivos triturada apenas uma vez e então você poderia apenas fundo todos os três rsyncs para executá-los em paralelo.
fonte
Outra solução possível é apenas executar tantos processos rsync em paralelo quanto os hosts, ou seja, fork.
fonte