paraleliza as chamadas rsync usando o gnu parallel

3

Estou tentando paralelizar minhas chamadas rsync usando o gnu-parallel, conforme mostrado abaixo. Mas sempre que eu corro meu script abaixo, parece que não copia nada. Mas eu vejo muitos processos de rsync (ps aux | grep rsync) em execução, então não tenho certeza do que está errado aqui:

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."

Há algo de errado que estou fazendo aqui?

    
por david 02.03.2018 / 06:22

1 resposta

1

Você está processando os argumentos incorretamente na função do_Copy que você definiu. Tome cuidado extra no processamento de argumentos posicionais no shell script. Seu código apenas deixa um argumento da matriz em seu comando final.

Você precisa usar $@ como a lista completa de argumentos em sua função como

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
}

e cite as variáveis ao chamar o array

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

Depois de armazenar o $1 na função, com uma primeira chamada para shift , o restante dos argumentos posicionais estará disponível em "$@" , que você originalmente pretendia armazenar.

    
por 02.03.2018 / 08:09