以下のように、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
定義した関数で引数を誤って処理しました。シェルスクリプトで位置パラメータを処理するときは注意してください。コードは、最後のコマンドの配列に1つのパラメータを保持するだけです。
$@
関数は完全なパラメータリストを使用する必要があります。
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
元々保存しようとしていた残りの位置引数を使用します。"$@"