コードを配布するリモートサーバーがあります。私は現在scp
アップロードコードを使用していますが、遅すぎる(またはより効率的な他のコードに)scp
切り替えたいと思います。接続をrsync
確立する際にボトルネックが発生するため、ssh
サーバーへの接続数を最小限に抑えたいと思います。
ローカルでは、私のビルドプロセスはサブディレクトリとサブディレクトリをout
含むディレクトリを出力します。出力ファイルのサブセットをリモートサーバーの一致する場所にプッシュします。bin
lib
etc
私のscp
コマンドは次のとおりです。
scp out/bin/$BINFILES remote:/usr/bin
scp out/lib/$LIBFILES remote:/usr/lib
scp out/etc/$ETCFILES remote:/etc
これにより、リモートサーバーに3つの接続が確立され、ファイルが変更されていなくてもファイル全体がコピーされます。これが私がしたことです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
より高速ですが(圧縮と重複排除)、まだリモートサーバーに3つの接続を作成します。
rsync
単一のコマンドを使用してこれら3つのコピーを取得する方法はありますか?これがうまくいけば、コピーする前にすべての {src,dest} ペアを一時ファイルに入れることになります。
私は他のツールを試すこともできますが、OS X(現在の開発プラットフォーム)で動作し、理想的にはトランスポート最適化をサポートする必要がありますrsync
。
答え1
複数の連続したrsyncコマンドが遅いのは、SSH接続を確立するのに時間がかかるためです。この問題は次のように解決できます。設定された SSH チャネルの使用。デフォルトの接続共有設定次に、デフォルト接続を開き、rsyncコマンドを変更せずに使用し(このコマンドは-e ssh
約10年間デフォルトコマンドでした)、最後に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
SSH接続共有が利用できない場合(たとえば、片側でDropbearまたは非常に古いOpenSSHバージョンを実行しているため)、次のことができます。トンネルの構築しかし、これはもっと問題になります。
または、少しの操作で、次を使用してrsyncコマンドを1つにリファクタリングすることもできます。再同期フィルタそしてシンボリックリンク。移動bin
してディレクトリを指定できる場合はlib
簡単です。
mkdir out/usr
mv out/bin out/lib out/usr/
rsync -avz \
--include='/bin/***' --include='/lib/***' --include='/etc/***' \
--exclude='*' out/ remote:/
移動できませんが、コピーするツリーに絶対シンボリックリンクがない場合は、絶対シンボリックリンクを使用してrsyncにディレクトリとして処理するように指示できます。
ln -s "$PWD" out/usr
rsync -avz --copy-unsafe-links \
--include='/bin/***' --include='/lib/***' --include='/etc/***' \
--exclude='*' out/ remote:/