Como copiar em duas pastas simultaneamente usando o GNU paralelo, gerando múltiplos encadeamentos?

1

Estou tentando copiar arquivos de machineB e machineC para machineA enquanto estou executando meu script de shell abaixo em machineA .

Se os arquivos não estiverem em machineB , eles devem estar em machineC , então tentarei copiar os arquivos de machineB primeiro, se ele não estiver em machineB , então tentarei copiando os mesmos arquivos de machineC .

Eu estou copiando os arquivos em paralelo usando a biblioteca GNU Parallel e está funcionando bem. Atualmente estou copiando dois arquivos em paralelo.

Anteriormente, eu estava copiando os arquivos PRIMARY_PARTITION na pasta PRIMARY usando o GNU paralelo e, uma vez feito isso, somente eu copiava os arquivos SECONDARY_PARTITION na pasta SECONDARY usando o mesmo GNU paralelo, então é seqüencial a partir de agora wrt PRIMARY e SECONDARY pasta.

Agora decidi copiar arquivos na pasta PRIMARY e SECONDARY simultaneamente. Ou seja, vou copiar dois arquivos na pasta PRIMARY junto com dois arquivos na pasta SECONDARY simultaneamente.

Abaixo está o meu script de shell que eu tenho -

#!/bin/bash

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary
readonly FILERS_LOCATION=(machineB machineC)
export FILERS_LOCATION_1=${FILERS_LOCATION[0]}
export FILERS_LOCATION_2=${FILERS_LOCATION[1]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers
SECONDARY_PARTITION=(1643 1103 1372 1096 1369 1568) # this will have more file numbers

export dir3=/testing/snapshot/20140103

find "$PRIMARY" -mindepth 1 -delete
find "$SECONDARY" -mindepth 1 -delete

do_CopyInPrimary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/.
}
export -f do_CopyInPrimary

do_CopyInSecondary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/.
}
export -f do_CopyInSecondary


parallel -j 2 do_CopyInPrimary ::: "${PRIMARY_PARTITION[@]}" &
parallel -j 2 do_CopyInSecondary ::: "${SECONDARY_PARTITION[@]}" &
wait

echo "All files copied."

Descrição do problema: -

Com o script acima, em algum momento, estou recebendo essa exceção -

ssh_exchange_identification: Connection closed by remote host
ssh_exchange_identification: Connection closed by remote host
ssh_exchange_identification: Connection closed by remote host

Existe alguma maneira melhor de fazer a mesma coisa que eu estou fazendo atualmente? Eu acho que ainda posso usar o GNU Parallel para fazer isso funcionar?

    
por arsenal 21.05.2014 / 06:54

1 resposta

3

O erro geralmente é causado por muitos ssh / scp começando ao mesmo tempo. Isso é um pouco estranho, já que você, no máximo, executa 4. Isso me leva a acreditar em / etc / ssh / sshd_config: MaxStartups e MaxSessions em $ FILERS_LOCATION_1 + 2 estão muito baixos.

Por sorte, podemos pedir ao GNU Parallel para tentar novamente se um comando falhar:

do_Copy() {
  el=$1
  PRIMSEC=$2
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMSEC/.
}
export -f do_Copy

parallel --retries 10 -j 2 do_Copy {} $PRIMARY ::: "${PRIMARY_PARTITION[@]}" &
parallel --retries 10 -j 2 do_Copy {} $SECONDARY ::: "${SECONDARY_PARTITION[@]}" &
wait

echo "All files copied."
    
por 21.05.2014 / 10:30