Я бы сделал это с GNU Parallel , который хорошо справляется с тем, что делать в случае сбоя любого задания ... в случае сбоя одного или нескольких процентов, независимо от того, следует ли прекратить выполнение других заданий немедленно или только новые задания не должны запускаться.
В указанном вами случае c:
parallel -j 4 --halt now,fail=1 --line-buffer ::: progA progB progC 'sleep 2; progD'
Это говорит о том, что ... " запустите все четыре задания параллельно и немедленно прекратите работу, уничтожив все другие, если какое-либо задание не выполнено. Буферизируйте вывод по строкам. Задания, которые должны быть выполнены, затем указываются после :::
, и они являются только вашими заданиями, но с задержкой перед последним. "
Вам может понравиться вывод, помеченный именем задания, чтобы вы могли видеть, какие выходы пришли из каких процессов, если это так, используйте parallel --tag ...
Вы можете отложить / пошатнуть запуск каждого задания, в В этом случае используйте parallel --delay 1
для запуска заданий с интервалом в 1 секунду и удаления sleep 2
.