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


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

Але це не спрацювало належним чином (я хочу одночасно запускати групи команд паралельно. Також мені потрібно чекати, коли перша група закінчиться, перш ніж запустити наступну групу)

Сценарій виходить із повідомленням про помилку!


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
$   

Я думаю, що кучері у вашому прикладі абсолютно безглузді. Зачекайте, що процес є глобальним, і зведені групи не створять новий вилка в цьому випадку.
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 #<===

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


2
У початковому запитанні було сказано лише "запускати кожні 3 команди разом". Без уточнення будь-яка відповідь правильна. Гарний дзвінок на wait.
RobertL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.