複数のスレッドを作成してGNUを使用して2つのフォルダを同時にコピーする方法は?

複数のスレッドを作成してGNUを使用して2つのフォルダを同時にコピーする方法は?

machineB作業中でファイルをコピーしようとしています。machineCmachineAmachineA

ファイルがない場合はmachineB明らかに存在する必要があるので、machineCまずファイルをコピーしてみてください。そうでない場合は同じファイルをコピーしてみましょう。machineBmachineBmachineC

私はGNUパラレルライブラリを使ってファイルをパラレルにコピーしていますが、うまくいきます。現在、2つのファイルを並列にコピーしています。

以前は、GNUを使用してフォルダ内のファイルを並列にコピーし、完了したら、同じGNUを使用してフォルダ内のファイルを並列PRIMARY_PARTITIONにコピーしました。これまでは順次フォルダです。PRIMARYSECONDARY_PARTITIONSECONDARYPRIMARYSECONDARY

PRIMARYこれで、ファイルとフォルダの両方をコピーすることにしましたSECONDARY。つまり、PRIMARY1つのフォルダに2つのファイルと1つのフォルダに2つのファイルを同時にコピーすることを意味します。SECONDARY

以下は私のシェルスクリプトです -

#!/bin/bash

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary
readonly FILERS_LOCATION=(machineB machineC)
export FILERS_LOCATION_1=${FILERS_LOCATION[0]}
export FILERS_LOCATION_2=${FILERS_LOCATION[1]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers

export dir3=/testing/snapshot/20140103

find "$PRIMARY" -mindepth 1 -delete
find "$SECONDARY" -mindepth 1 -delete

do_CopyInPrimary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/.
}
export -f do_CopyInPrimary

do_CopyInSecondary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/.
}
export -f do_CopyInSecondary


parallel -j 2 do_CopyInPrimary ::: "${PRIMARY_PARTITION[@]}" &
parallel -j 2 do_CopyInSecondary ::: "${SECONDARY_PARTITION[@]}" &
wait

echo "All files copied."

問題の説明:-

上記のスクリプトを使用すると、ある時点でこの例外が発生しました。

ssh_exchange_identification: Connection closed by remote host
ssh_exchange_identification: Connection closed by remote host
ssh_exchange_identification: Connection closed by remote host

現在やっていることと同じことをするより良い方法はありますか?私はまだGNU Parallelを使って動作させることができますか?

ベストアンサー1

このエラーは通常、同時に多くの ssh/scp 起動が原因で発生します。 4まで走るからちょっとおかしいですね。これにより、/etc/ssh/sshd_config:$FILERS_LOCATION_1+2 の MaxStartups と MaxSessions が低すぎると考えられます。

幸いなことに、コマンドが失敗した場合は、GNU Parallelに再試行するように要求できます。

do_Copy() {
  el=$1
  PRIMSEC=$2
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.
}
export -f do_Copy

parallel --retries 10 -j 2 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" &
parallel --retries 10 -j 2 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" &
wait

echo "All files copied."

おすすめ記事