如何通过生成多个线程使用 GNU 并行同时复制两个文件夹?

如何通过生成多个线程使用 GNU 并行同时复制两个文件夹?

我正在尝试将文件复制到其中machineB,因为我正在.machineCmachineAmachineA

如果文件不存在,machineB那么它肯定应该存在,machineC所以我将尝试首先复制文件machineB,如果它不存在,machineB那么我将尝试从 复制相同的文件machineC

我正在使用 GNU 并行库并行复制文件,并且工作正常。目前我正在并行复制两个文件。

早些时候,我使用 GNU 并行复制文件夹PRIMARY_PARTITION中的文件PRIMARY,一旦完成,我就只使用相同的 GNU 并行复制文件夹SECONDARY_PARTITION中的文件SECONDARY,因此到目前为止,它是按顺序的PRIMARYSECONDARY文件夹。

现在我决定同时复制文件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 来使其工作吗?

答案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."

相关内容