Оператор Bash & (амперсанд)

Я пытаюсь запустить 3 команды параллельно в оболочке bash:

$ (first command) & (second command) & (third command) & wait

Проблема заключается в том, что если first command не работает, например, код выхода 0 (я думаю, потому что wait завершается успешно).

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

Как я мог достичь этого?

Обратите внимание, что я хочу запускать команды параллельно!

Ответ 1

лучшее, что я могу придумать:

first & p1=$!
second & p2=$!
...

wait $p1 && wait $p2 && ..

или

wait $p1 || ( kill $p2 $p3 && exit 1 )
...

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

Ответ 2

Вы должны использовать && вместо &. например:

first command && second command && third command && wait

Однако это НЕ будет запускать вашу команду параллельно, поскольку каждое последующее выполнение команды будет зависеть от кода выхода 0 предыдущей команды.

Ответ 3

Это может сработать для вас:

parallel -j3 --halt 2 <list_of_commands.txt

Это будет запускать 3 команды параллельно.

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