4

Я пытаюсь сделать сценарий оболочки, чтобы запустить серию долгосрочных процессов. Давайте назовем их a, b, c, d и e. Процессы b, c и d должны выполняться параллельно, а процесс e должен выполняться после успешного завершения всех предыдущих.

Вот мой (псевдо) код:

{
    echo "starting a"
    a
}&&
{
    (echo "starting b"; b; exit $?)&
    (echo "starting c"; c; exit $?)&
    (echo "starting d"; d; exit $?)&
    wait
}&&
{
    echo "starting e"
    e
}

Моя проблема заключается в том, что если какой-либо из b, c, d завершится неудачно, скрипт продолжит работу и выполнит e. Есть ли способ предотвратить это?

Огромное спасибо за любые ответы!

Antoine

2 ответа2

2
{
    (echo "starting b"; b)&
    (echo "starting c"; c)&
    (echo "starting d"; d)&
    wait %1 && wait %2 && wait %3
}&&

при ожидании определенного задания wait возвращает этот код завершения задания

Чтобы понять, посмотрите на эти два примера:
только последняя строка имеет значение (показывает статус выхода wait

(sleep 3; false) & wait; echo $?
[1] 25358
[1]+  Exit 1                  ( sleep 3; false )
0

-

(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+  Exit 1                  ( sleep 3; false )
1
0

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

wait будет сообщать значение любого сигнала в выходном коде, если это применимо. Это не то, что вы ищете.

Решение состоит в том, чтобы каждая команда сообщала о своем статусе в stdout и подсчитывала ответы с помощью grep.

{
  (echo "starting b"; b && echo ok)&
  (echo "starting c"; c && echo ok)&
  (echo "starting d"; d && echo ok)&
} | 
grep -c ok | ( read n && (( n==3 )) ) && 

{
echo "starting e"; e
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .