Cómo paralelizar el bucle for mientras scp los files?

Estoy ejecutando mi script de shell inferior de machineA que está copyndo los files machineB y machineC en machineA . Si los files no están allí en machineB , entonces deberían estar allí en machineC .

El siguiente script de shell copyrá los files en el directory TEST1 y TEST2 en 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 

¿Hay alguna manera de ejecutar el process paralelamente en el bucle de un script bash?

Actualmente copy el file de machineB y machineC en el directory machineA TEST1 primero, y si lo hace, solo irá y copyrá los files de machineB y machineC en el directory de machineA TEST2 … ¿Hay alguna manera de transferir los files tanto en TEST1 y TEST2 simultáneamente?

Estoy ejecutando Ubuntu 12.04

Además de enviarlos a segundo plano, use la wait incorporada para esperar a que finalicen todos los processs en segundo plano 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." 

Deberías echar un vistazo al proyecto pssh , hay un command pscp que ejecuta un scp paralelo

Tu puedes hacer:

 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/ & 

El & al final separará el command, devolviendo el control al script.

Si pones esto en un bucle, esto ejecutará todos los cuerpos en paralelo. Para esperar a que terminen todos estos trabajos en segundo plano, use

 wait