Bash & (амперсанд) оператор - PullRequest
15 голосов
/ 13 февраля 2012

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

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

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

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

Как мне этого добиться?

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

Ответы [ 3 ]

7 голосов
/ 13 февраля 2012

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

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

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

или

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

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

4 голосов
/ 13 февраля 2012

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

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

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

2 голосов
/ 13 февраля 2012

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

parallel -j3 --halt 2 <list_of_commands.txt

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

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

...