我正在尝试使用 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
其余位置参数。"$@"