Назад | Перейти на главную страницу

Как распараллелить цикл 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

https://unix.stackexchange.com/questions/53390/is-there-a-way-to-run-process-parallelly-in-the-loop-of-a-bash-script

В настоящее время он копирует файл из machineB и machineC в machineA TEST1 каталог сначала, и если это будет сделано, то только он будет копировать файлы из machineB и machineC в machineA TEST2 каталог .. Есть ли способ передать файлы как в TEST1 и TEST2 каталог одновременно?

Я использую Ubuntu 12.04

Заменить

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 и выполнит ACTION для элемента в фоновом режиме.

Затем он проверяет, сколько заданий все еще выполняется, и ждет, пока вы не закончите поток, чтобы продолжить.