Как распараллелить цикл for, пока scp файлы?
Я запускаю мой скрипт ниже machineA
который копирует файлы machineB
а также machineC
в machineA
, Если файлов нет в machineB
тогда это должно быть там в machineC
,
Приведенный ниже сценарий оболочки скопирует файлы в TEST1
а также TEST2
каталог в 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
В настоящее время он копирует файл из machineB
а также machineC
в machineA
TEST1
сначала каталог, и если это будет сделано, то только он пойдет и скопирует файлы из machineB
а также machineC
в machineA
TEST2
каталог.. Есть ли способ передать файлы как в TEST1
а также TEST2
каталог одновременно?
Я использую Ubuntu 12.04
2 ответа
Замещать
done
с участием
done &
Это запустит два цикла for в фоновом режиме.
И закончите скрипт:
wait
Это будет ждать завершения двух циклов for.
Попробуйте что-то вроде этого.
PROCESSES=4 # Number of threads you want
for item in ${LIST}; do
ACTION ${item} &
while (( $(jobs |wc -l) >= (( ${PROCESSES} + 1 )) )); do
sleep 0.1
done
done
wait
Это будет работать с вашими элементами в LIST и выполнять действие с элементом на заднем плане.
Затем он проверяет, сколько заданий еще выполняется, и ожидает, пока вы не закроете поток, чтобы продолжить.