Como paralelizar o loop for enquanto scp os arquivos? [duplicado]

3

Estou executando meu script de shell abaixo de machineA , que está copiando os arquivos machineB e machineC em machineA . Se os arquivos não estão em machineB , então deve estar lá em machineC .

O script de shell abaixo copiará os arquivos no diretório TEST1 e TEST2 em machineA ..

#!/bin/bash
set -e

readonly TEST1=/data01/test1
readonly TEST2=/data02/test2
readonly SERVER_LOCATION=(machineB machineC)
readonly FILE_LOCATION=/data/snapshot

dir1=$(ssh -o "StrictHostKeyChecking no" david@${SERVER_LOCATION[0]} ls -dt1 "$FILE_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${SERVER_LOCATION[1]} ls -dt1 "$FILE_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

echo $dir1
echo $dir2

if [ "$dir1" = "$dir2" ]
then
    rm -rf $TEST1/*
    rm -rf $TEST2/*
    for el in $test1_partition
    do
        scp david@${SERVER_LOCATION[0]}:$dir1/pp_monthly_9800_"$el"_200003_5.data $TEST1/. || scp david@${SERVER_LOCATION[1]}:$dir2/pp_monthly_9800_"$el"_200003_5.data $TEST1/.
    done
    for sl in $test2_partition
    do    
        scp david@${SERVER_LOCATION[0]}:$dir1/pp_monthly_9800_"$sl"_200003_5.data $TEST2/. || scp david@${SERVER_LOCATION[1]}:$dir2/pp_monthly_9800_"$sl"_200003_5.data $TEST2/.
    done
fi

Existe uma maneira de executar o processo paralelamente no loop de um script bash

No momento, ele copia o arquivo do diretório machineB e machineC para machineA TEST1 primeiro e, se estiver pronto, apenas copiará os arquivos de machineB e machineC para machineA TEST2 directory .. Existe alguma maneira de transferir os arquivos no diretório TEST1 e TEST2 simultaneamente?

Estou executando o Ubuntu 12.04

    
por arsenal 15.02.2014 / 03:45

3 respostas

2

Além de enviá-los para o segundo plano, use o wait incorporado para aguardar que todos os processos em segundo plano sejam concluídos antes de continuar.

for el in $test1_partition
do
    (scp david@${SERVER_LOCATION[0]}:$dir1/pp_monthly_9800_"$el"_200003_5.data $TEST1/. || scp david@${SERVER_LOCATION[1]}:$dir2/pp_monthly_9800_"$el"_200003_5.data $TEST1/.) &
    WAITPID="$WAITPID $!"
done
for sl in $test2_partition
do    
    (scp david@${SERVER_LOCATION[0]}:$dir1/pp_monthly_9800_"$sl"_200003_5.data $TEST2/. || scp david@${SERVER_LOCATION[1]}:$dir2/pp_monthly_9800_"$sl"_200003_5.data $TEST2/.) &
    WAITPID="$WAITPID $!"
done
wait $WAITPID
echo "All files done copying."
    
por 15.02.2014 / 21:43
1

Você deve dar uma olhada no projeto pssh , há um comando pscp que corre em paralelo scp

    
por 15.02.2014 / 21:48
1

Você pode fazer:

scp david@${SERVER_LOCATION[0]}:$dir1/pp_monthly_9800_"$el"_200003_5.data $TEST1/ ||
scp david@${SERVER_LOCATION[1]}:$dir2/pp_monthly_9800_"$el"_200003_5.data $TEST1/ &

O & no final desanexará o comando, retornando o controle para o script.

Se você colocar isso em um loop, isso executará todos os corpos em paralelo. Para esperar que todos esses trabalhos em segundo plano sejam concluídos, use

wait
    
por 15.02.2014 / 04:24