gnu Parallel을 사용하여 rsync 호출 병렬화

gnu Parallel을 사용하여 rsync 호출 병렬화

아래와 같이 gnu-parallel을 사용하여 rsync 호출을 병렬화하려고 합니다. 하지만 아래 스크립트를 실행할 때마다 아무 것도 복사하지 않는 것 같습니다. 하지만 많은 rsync 프로세스가 (ps aux | grep rsync)실행 중인 것을 볼 수 있으므로 여기서 무엇이 문제인지 잘 모르겠습니다.

export PRIMARY=/data01/test_primary
export SECONDARY=/data02/test_secondary
export dir3=/bat/data/snapshot/20180227
PRIMARY_FILES=(685 959 682 679 688 651 909 906 657 881 884 878 853 707 847)
SECONDARY_FILES=(950 883 887 890 1001 994 997 1058 981 833)

export LOCATION_1="machineA"
export LOCATION_2="machineB"
export LOCATION_3="machineC"

do_Copy() {
  el=$1
  PRIMSEC=$2
  rsync -az golden@"$LOCATION_1":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || rsync -az golden@"$LOCATION_2":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || rsync -az golden@"$LOCATION_3":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || exit 1
}
export -f do_Copy
parallel -j 5 do_Copy {} $PRIMARY ::: ${PRIMARY_FILES[@]} &
parallel -j 5 do_Copy {} $SECONDARY ::: ${SECONDARY_FILES[@]} &
wait

echo "All copied."

내가 여기서 뭔가 잘못하고 있는 걸까요?

답변1

do_Copy정의한 함수에서 인수를 잘못 처리했습니다. 쉘 스크립트에서 위치 매개변수를 처리할 때는 주의하십시오. 코드는 최종 명령의 배열에 하나의 매개변수만 유지하면 됩니다.

$@함수에서 전체 매개변수 목록을 사용해야 합니다.

do_Copy() {
  (( "$#" )) || { printf 'insufficient args supplied' >&2 ; return 2; }

  el="$1"; shift
  PRIMSEC="$@"

  rsync -az golden@"$LOCATION_1":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || rsync -az golden@"$LOCATION_2":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || rsync -az golden@"$LOCATION_3":"$dir3"/proc_"$el"_5.data "$PRIMSEC"/. || exit 1
}

배열을 호출할 때 변수를 참조합니다.

export -f do_Copy
parallel -j 5 do_Copy {} "$PRIMARY" ::: "${PRIMARY_FILES[@]}" &

$1함수에 저장 되면 첫 번째 호출은 shift원래 저장하려고 했던 나머지 위치 인수를 사용합니다."$@"

관련 정보