使用 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您在定义的函数中错误地处理了参数。在处理 shell 脚本中的位置参数时要格外小心。您的代码只需在最终命令中保留数组中的一个参数即可。

您需要$@在函数中使用完整的参数列表

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其余位置参数。"$@"

相关内容