rsync'ing vários pares {src, dest}

3

Eu tenho um servidor remoto no qual estou implantando o código. No momento, estou usando scp para fazer o upload do código, mas scp é muito lento e gostaria de mudar para rsync (ou outra coisa mais eficiente). O gargalo está em fazer a conexão ssh , então eu gostaria de minimizar o número de conexões que eu faço para o servidor.

Localmente, o processo de criação gera um diretório out contendo os subdiretórios bin , lib e etc . Eu estou empurrando um subconjunto dos arquivos de saída para posições correspondentes no servidor remoto.

Meus comandos scp são assim:

scp out/bin/$BINFILES remote:/usr/bin
scp out/lib/$LIBFILES remote:/usr/lib
scp out/etc/$ETCFILES remote:/etc

Isso faz três conexões com o servidor remoto e copia os arquivos na íntegra, mesmo que eles não tenham sido modificados. Foi o que fiz com rsync :

rsync -e ssh -avz out/bin/$BINFILES remote:/usr/bin
rsync -e ssh -avz out/lib/$LIBFILES remote:/usr/lib
rsync -e ssh -avz out/etc/$ETCFILES remote:/etc

que é mais rápido (compactação e eliminação de duplicatas), mas ainda faz três conexões com o servidor remoto.

Existe uma maneira de obter essas três cópias usando um único comando rsync ? Estou aberto para, por exemplo colocando todos os pares {src, dest} em um arquivo temporário antes de copiar, se isso funcionar.

Eu também estou aberto a experimentar uma ferramenta diferente, mas ela deve estar disponível para o OS X (minha plataforma de desenvolvimento atual), e deve preferencialmente suportar otimizações de transferência como rsync .

    
por nneonneo 01.06.2014 / 23:27

1 resposta

7

A razão pela qual vários comandos rsync sucessivos são lentos é que o estabelecimento de uma conexão SSH demora um pouco. Você pode resolver esse problema usando um canal SSH estabelecido . Configure o compartilhamento de conexão principal e abra um mestre conexão, use seus comandos rsync inalterados (note que -e ssh tem sido o padrão desde uma década ou mais) e, finalmente, feche a conexão SSH:

ssh -Nf remote
rsync -avz out/bin/$BINFILES remote:/usr/bin
rsync -avz out/lib/$LIBFILES remote:/usr/lib
rsync -avz out/etc/$ETCFILES remote:/etc
ssh -O exit remote

Se você não pode usar o compartilhamento de conexão SSH (por exemplo, porque um lado está executando o Dropbear ou uma versão muito antiga do OpenSSH), você pode estabelecer um túnel , mas isso é mais complicado.

Alternativamente, com um pouco de trabalho, você pode refatorar seu comando rsync em um, jogando com filtros rsync e links simbólicos. Se você pode mover os diretórios bin e lib , é muito fácil:

mkdir out/usr
mv out/bin out/lib out/usr/
rsync -avz \
      --include='/bin/***' --include='/lib/***' --include='/etc/***' \
      --exclude='*' out/ remote:/

Se você não conseguir movê-los, mas não houver nenhum link simbólico absoluto nas árvores copiadas, use um link simbólico absoluto e diga ao rsync para tratá-lo como um diretório:

ln -s "$PWD" out/usr
rsync -avz --copy-unsafe-links \
      --include='/bin/***' --include='/lib/***' --include='/etc/***' \
      --exclude='*' out/ remote:/
    
por 02.06.2014 / 02:53

Tags