Оператор 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 команды параллельно.
Если какое-либо работающее задание завершится неудачно, он убьет оставшиеся запущенные задания, а затем остановится, возвращая код выхода неудачного задания.