machineA
.NETでファイルを変換するシェルスクリプトを実行していますmachineB
。machineC
machineA
ファイルが にない場合は必ず になけれmachineB
ばなりません。machineC
だからまずファイルをコピーしてみてmachineB
、ファイルがなければ同じファイルをコピーしmachineB
てみましょう。machineC
このフォルダ内には次のフォルダがmachineB
あります。machineC
YYYYMMDD
/data/pe_t1_snapshot
したがって、上記のフォルダ内で、この形式の最新の日付が何であれ、そのYYYYMMDD
フォルダをファイルのコピーを開始する必要があるフルパスとして選択します。
20140317
したがって、これが内部の最新の日付フォルダである場合、/data/pe_t1_snapshot
これが私のフルパスになるとしましょう。
/data/pe_t1_snapshot/20140317
machineB
どこでファイルのコピーを開始する必要がありますかmachineC
?と400
からファイルをコピーする必要があります。各ファイルサイズはです。machineA
machineB
machineC
2.5 GB
以前は、ファイルを1つずつコピーしようとしましたが、machineA
非常に遅かったです。machineA
Bashシェルスクリプトのスレッドを使用して「3つの」ファイルを一度にコピーする方法はありますか?
machineA
以下は、frommachineB
とファイルを1つずつコピーするシェルスクリプトですmachineC
。
#!/usr/bin/env bash
readonly PRIMARY=/export/home/david/dist/primary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot
PRIMARY_PARTITION=(0 548 272 4 544 276 8 556 280 12 552 284 16 256 564 20 260 560 24 264 572) # this will have more file numbers around 200
dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
## Build your list of filenames before the loop.
for n in "${PRIMARY_PARTITION[@]}"
do
primary_files="$primary_files :$dir1"/t1_weekly_1680_"$n"_200003_5.data
done
if [ "$dir1" = "$dir2" ]
then
find "$PRIMARY" -mindepth 1 -delete
rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/ 2>/dev/null
rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/ 2>/dev/null
fi
それで、一度に1つのファイルをコピーするのではなく、「3つの」ファイルを一度にコピーするのはどうでしょうか? 3つのファイルが完了したら、リスト内の他の3つのファイルに移動してコピーします。同じ時間?
私は3つのパテインスタンスを開き、同時に3つのインスタンスすべてからファイルをコピーしました。 3つのファイルすべてが約50秒でコピーされたので、私は高速です。このため、一度に1つのファイルをコピーするのではなく、一度に3つのファイルをコピーしてみました。
大丈夫ですか?もしそうなら、誰でも例をあげることができますか?私はそれを試してみて、それがどのように進行するのか見たかったのです。
@terdonは上記の問題を解決するのに役立ちましたが、一度に3つのファイルをコピーしてどのように機能するかを確認したいと思います。
直す:-
以下は、上記のシェルスクリプトを簡略化したバージョンです。machineB
これを行うと、machineC
に存在するファイル番号をコピーしようとします。machineA
machineA
PRIMARY_PARTITION
#!/usr/bin/env bash
readonly PRIMARY=/export/home/david/dist/primary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot
PRIMARY_PARTITION=(0 548 272 4 544 276 8 556 280 12 552 284 16 256 564 20 260 560 24 264 572) # this will have more file numbers around 200
dir1=/data/pe_t1_snapshot/20140414
dir2=/data/pe_t1_snapshot/20140414
## Build your list of filenames before the loop.
for n in "${PRIMARY_PARTITION[@]}"
do
primary_files="$primary_files :$dir1"/t1_weekly_1680_"$n"_200003_5.data
done
if [ "$dir1" = "$dir2" ]
then
# delete the files first and then copy it.
find "$PRIMARY" -mindepth 1 -delete
rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/
rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/
fi
答え1
複数のコピーを並列に実行することはほとんど役に立ちません。制限要素がネットワーク帯域幅であるかディスク帯域幅であるかにかかわらず、それぞれ1/N倍速いNパラレルストリームが生成されます。
一方、複数のソース(ここではBとC)から複製するとき、ボトルネックがBとC側(共通側ではない)にある場合です。したがって、並列にコピーを試みることができます。
rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/ &
rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/ &
wait
2 つの rsync コマンドの出力を混ぜ合わせて別々のファイルに送ることができます。
log_base=$(date +%Y%m%d-%H%M%S-$$)
rsync -avz david@${FILERS_LOCATION[0]}"${primary_files}" $PRIMARY/ >$log_base-B.log &
rsync -avz david@${FILERS_LOCATION[1]}"${primary_files}" $PRIMARY/ >$log_base-C.log &
wait
スクリプトは同じ宛先に対して複数のSSH接続を使用します。 SSH接続の確立に避けられない遅延があります。接続を開いたまま再利用すると時間を節約できます。主な接続。
答え2
以下を使用して、複数のタスクを並列に実行できます。バックステージコース。一般的な例は次のとおりです。
rsync foo machine1: &
rsync bar machine2: &
rsync baz machine3: &
wait
wait
プログラムが前のポイント以上に進まないことを確認してください。みんなスクリプトによって生成されたバックグラウンドプロセスが完了しました。
コマンド区切り文字のように機能する&
ため、各コマンドラインの最後にあります。;