Выполнить два последовательных сценария bash параллельно 4 раза - PullRequest
3 голосов
/ 21 января 2020

У меня есть список файлов конфигурации:

cfg1.cfg
cfg2.cfg
cfg3.cfg
cfg4.cfg
cfg5.cfg
cfg6.cfg
cfg7.cfg
...

, которые служат для ввода двух сценариев:

script1.sh
script2.sh

, которые я последовательно запускаю следующим образом:

script1.sh cfgX.cfg && script2.sh cfgX.cfg

, где X = 1, 2, 3, ...

Эти сценарии не распараллелены и требуют много времени для запуска. Как я могу запустить их параллельно, скажем, 4 за один раз, чтобы я не убивал сервер, на котором я их запускаю?

Только для одного сценария я попробовал метод грубой силы, подобный следующему:

export COUNTER_LIMIT=4

export COUNTER=1

for each in $(ls *.cfg)
do

INSTRUCTION="./script1.sh $each "

if (($COUNTER >= $COUNTER_LIMIT)) ; 
then
$INSTRUCTION   &&
export COUNTER=$(($COUNTER-$COUNTER_LIMIT));
echo
sleep 600s
else
$INSTRUCTION  &
sleep 5s
fi

echo $COUNTER
export COUNTER=$(($COUNTER+1));

done

(спит потому, что по какой-то причине сценарии не могут быть запущены одновременно ...)

Итак, как мне сделать так, чтобы двойные амперсанды в

script1.sh cfgX.cfg && script2.sh cfgX.cfg

не блокирует ли распараллеливание грубой силы?

Я также принимаю лучшие и более простые подходы;)

Приветствия Хорхе

ОБНОВЛЕНИЕ

Я должен был упомянуть, что файлы конфигурации не обязательно имеют последовательное имя и могут иметь любое имя, я просто сделал их такими, чтобы сделать пример максимально простым.

Ответы [ 3 ]

4 голосов
/ 21 января 2020

РЕДАКТИРОВАТЬ:

ОБНОВЛЕНИЕ: I должен был упомянуть , что файлы конфигурации не обязательно имеют последовательное имя и могут иметь любое имя, Я просто сделал их такими, чтобы сделать пример как можно более простым.

parallel [options] [command [arguments]] < list_of_arguments

< list_of_arguments решает это определение задачи после изменения.

parallel --jobs 4  \
         --load 50% \
         --bar       \
         --eta "( echo 1st-for-{}; echo 2nd-for-{} )" < aListOfAdHocArguments.txt
0% 0:5=0s
1st-for-Abraca
2nd-for-Abraca
20% 1:4=0s                                                                                                                                                                                                 
1st-for-Dabra
2nd-for-Dabra
40% 2:3=0s                                                                                                                                                                                                 
1st-for-Hergot
2nd-for-Hergot
60% 3:2=0s                                                                                                                                                                                                 
1st-for-Fagot
2nd-for-Fagot
80% 4:1=0s                                                                                                                                                                                                 

100% 5:0=0s

Пожалуйста, уважайте DoS'ы и не-StackOverflow и, скорее, никогда не попадайте под первоначальное определение проблемы, это несправедливо по отношению к другим участникам и против сетевого этикета StackOverflow о том, как лучше всего задавать вопросы, сформулированные в MCVE, которые помогают поддерживать высокий уровень профессиональных стандартов среди членов сообщества, участвующих в сообществе - это честно и честно, не правда ли?

Q : Как я могу запустить их параллельно, скажем скажем, 4 в то время , поэтому я не убиваю сервер , где я их запускаю?

Прекрасное задание для GNU parallel

* 1 042 * Сначала давайте проверим локальную хост-экосистему (экзосистемы, выполняющие parallel -расположенные над ssh -подключенными удаленными хостами, возможно, но выходящие за рамки этого поста):
parallel --number-of-cpus
parallel --number-of-cores
parallel --show-limits

Для получения дополнительной информации о конфигурации за пределы --jobs 4, потенциально --memfree или --noswap, --load <max-load> или --keep-order и --results <aFile> или --output-as-files:

man parallel

parallel --jobs 4 \
         --bar     \
         --eta "( script1.sh cfg{}.cfg; script2.sh cfg{}.cfg )" ::: {1..123}

Здесь
эмулируется только парой тандемов echo -s для индексов с пониженным счетом, поэтому индикаторы выполнения невидимы и E stimated- T ime- of- A rrival --eta показания почти мгновенные ...:

parallel --jobs 4  \
         --load 50% \
         --bar       \
         --eta "( echo 1st-for-cfg-{}; echo 2nd-for-cfg-{} )" ::: {10..0}
0% 0:11=0s 7                                                                                                                                                                                               
1st-for-cfg-10
2nd-for-cfg-10
9% 1:10=0s 6                                                                                                                                                                                               
1st-for-cfg-9
2nd-for-cfg-9
18% 2:9=0s 5                                                                                                                                                                                               
1st-for-cfg-8
2nd-for-cfg-8
27% 3:8=0s 4                                                                                                                                                                                               
1st-for-cfg-7
2nd-for-cfg-7
36% 4:7=0s 3                                                                                                                                                                                               
1st-for-cfg-6
2nd-for-cfg-6
45% 5:6=0s 2                                                                                                                                                                                               
1st-for-cfg-5
2nd-for-cfg-5
54% 6:5=0s 1                                                                                                                                                                                               
1st-for-cfg-4
2nd-for-cfg-4
63% 7:4=0s 0                                                                                                                                                                                               
1st-for-cfg-3
2nd-for-cfg-3
72% 8:3=0s 0                                                                                                                                                                                               
1st-for-cfg-2
2nd-for-cfg-2
81% 9:2=0s 0                                                                                                                                                                                               
1st-for-cfg-1
2nd-for-cfg-1
90% 10:1=0s 0                                                                                                                                                                                              
1st-for-cfg-0
2nd-for-cfg-0
2 голосов
/ 21 января 2020

Это было бы довольно просто с find и xargs. Это будет запускать четыре процесса параллельно, и для любого данного файла конфигурации будет завершено script1.sh перед запуском script2.sh:

find . -name '*.cfg' -print0 | xargs -0 -P 4 -iCFG sh -c 'script1.sh CFG && script2.sh CFG'
1 голос
/ 21 января 2020

Я провел некоторый симуляционный тест, сначала я создал файл, как вы описали.

printf '%s\n' cfg{1..100}.cfg > file.txt

Теперь скрипт для его обработки.

!/bin/bash

file=file.txt
limit=2

array=()
while read -r cfg; do
  array+=("$cfg")
done < "$file"

for ((n=0; n<limit; n++)); do
  for ((i=n; i<${#array[@]}; i+=limit)); do
    echo script1.sh "${array[i]}" && echo script2.sh "${array[i]}" && sleep 2; echo
  done &
done

wait

Теперь, если вы запустите этот скрипт, вы должны увидеть, что произойдет. Эхо и сон есть только для наглядности :-), вы можете удалить их, если решили запустить скрипт. Измените значение лимита на содержание вашего собственного сердца. Идея и метод решения этой конкретной проблемы не исходили от меня. Это пришло от этого парня. https://github.com/e36freak/, дайте кредит, где это необходимо ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...