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

12

У меня есть сценарий, включающий несколько команд. Как я могу сгруппировать команды для запуска вместе (я хочу сделать несколько групп команд. Внутри каждой группы команды должны выполняться параллельно (одновременно). Группы должны запускаться последовательно, ожидая завершения одной группы перед запуском команды. следующая группа) ... т.е.

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10

Как я могу запустить каждые 3 команды, чтобы получить? Я старался:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10

Но это не сработало должным образом (я хочу одновременно запускать группы команд. Также мне нужно дождаться окончания первой группы, прежде чем запускать следующую группу)

Скрипт завершается с сообщением об ошибке!

RobertL
источник
2
Что значит бегать вместе? Вы имеете в виду работать параллельно в то же время? Откуда ты знаешь, что это "не работает должным образом?" Как вы узнаете, когда он работает правильно? Вы хотите дождаться окончания первой группы, прежде чем запускать следующую группу?
RobertL
@ RobertL. Да, я имею в виду параллельно. Сценарий завершается с сообщением об ошибке. Да, мне нужно дождаться окончания первой группы, прежде чем запускать следующую группу.
1
@ Goro цитирует вас, скрипт завершается с сообщением об ошибке. Пожалуйста, отредактируйте свой вопрос, чтобы добавить такое сообщение (для завершения) и удалить чат (полезные советы).
dave_alcarin
В каждом случае выполняется одна и та же команда? То же имя?
RobertL
1
@goro, это точно? «У вас есть несколько групп команд. Внутри каждой группы команды должны выполняться параллельно (одновременно). Группы должны выполняться последовательно, ожидая завершения одной группы перед началом следующей группы».
RobertL

Ответы:

20

Команды в каждой группе выполняются параллельно, и группы выполняются последовательно, каждая группа параллельных команд ожидает завершения предыдущей группы перед началом выполнения.

Ниже приведен рабочий пример:

Предположим, 3 группы команд, как в коде ниже. В каждой группе три команды запускаются в фоновом режиме &.

Эти 3 команды будут запущены почти одновременно и будут выполняться параллельно, пока сценарий не waitsбудет завершен.

После того, как все три команды, входящие в третью группу, command 10будут выполнены.

$ cat command_groups.sh 
#!/bin/sh

command() {
    echo $1 start
    sleep $(( $1 & 03 ))      # keep the seconds value within 0-3
    echo $1 complete
}

echo First Group:
command 1 &
command 2 &
command 3 &
wait

echo Second Group:
command 4 &
command 5 &
command 6 &
wait

echo Third Group:
command 7 &
command 8 &
command 9 &
wait

echo Not really a group, no need for background/wait:
command 10

$ sh command_groups.sh 
First Group:
1 start
2 start
3 start
1 complete
2 complete
3 complete
Second Group:
4 start
5 start
6 start
4 complete
5 complete
6 complete
Third Group:
7 start
8 start
9 start
8 complete
9 complete
7 complete
Not really a group, no need for background/wait:
10 start
10 complete
$   
RobertL
источник
Я думаю, что кудряшки совершенно бессмысленны в вашем примере. Ожидание является глобальным процессом, и в этом случае изогнутые группы не будут создавать новый форк.
PSkocik
1
@PSkocik, правда. Рудиментарные органы.
RobertL
6
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

Должен работать (каждый отдельный компонент триплета будет работать последовательно, но группы будут работать параллельно). Вы, вероятно, не хотите, чтобы ваша родительская оболочка выходила до того, как группы закончили - отсюда и wait.

PSkocik
источник
2
В первоначальном вопросе говорилось только «запускайте каждые 3 команды вместе». Без уточнения любой ответ является правильным. Хороший звонок на wait.
RobertL