여러 스레드를 생성하여 GNU를 사용하여 두 폴더를 동시에 복사하는 방법은 무엇입니까?

여러 스레드를 생성하여 GNU를 사용하여 두 폴더를 동시에 복사하는 방법은 무엇입니까?

machineB작업 중이어서 파일을 복사하려고 합니다 .machineCmachineAmachineA

파일이 없으면 machineB분명히 존재해야 하므로 machineC먼저 파일을 복사해 보고 machineB, 없으면 machineB에서 동일한 파일을 복사해 보겠습니다 machineC.

저는 GNU 병렬 라이브러리를 사용하여 파일을 병렬로 복사하고 있는데 잘 작동합니다. 현재 두 개의 파일을 병렬로 복사하고 있습니다.

이전에는 GNU를 사용하여 폴더 PRIMARY_PARTITION의 파일을 병렬로 복사했으며 PRIMARY일단 완료되면 동일한 GNU를 사용하여 폴더 SECONDARY_PARTITION의 파일을 SECONDARY병렬로 복사했습니다. 지금까지는 순차 PRIMARYSECONDARY폴더입니다.

PRIMARY이제 파일 과 폴더를 모두 복사하기로 결정했습니다 SECONDARY. 즉, PRIMARY한 폴더에 두 개의 파일과 한 폴더에 두 개의 파일을 동시에 복사하겠다는 뜻입니다 .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."

관련 정보