Linux

如何通過生成多個執行緒使用 GNU 並行同時複製兩個文件夾?

  • September 13, 2017

當我在. machineB_machineC``machineA``machineA

如果文件不在那裡,machineB那麼它肯定應該在那裡,machineC所以我會先嘗試從那裡複製文件machineB,如果它不在那裡,machineB那麼我會嘗試從machineC.

我正在使用 GNU Parallel 庫並行複製文件,它工作正常。目前我正在並行複制兩個文件。

早些時候,我使用 GNU 並行複製PRIMARY_PARTITION文件PRIMARY夾中的文件,一旦完成,然後我只使用相同的 GNU 並行複製SECONDARY_PARTITION文件夾中的文件,因此它現在是連續的 wrt和文件夾。SECONDARY``PRIMARY``SECONDARY

現在我決定同時復製文件PRIMARYSECONDARY文件夾。意思是,我將同時復製文件PRIMARY夾中的兩個文件以及文件夾中的兩個文件SECONDARY

下面是我的shell腳本 -

#!/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 讓它工作嗎?

該錯誤通常是由同時啟動的 ssh/scp 過多引起的。這有點奇怪,因為您最多執行 4。這讓我相信 $FILERS_LOCATION_1+2 上的 /etc/ssh/sshd_config: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."

引用自:https://unix.stackexchange.com/questions/131250