Управлять заданиями bash как группой?

Управлять заданиями bash как группой?

Есть ли способ контролировать группу заданий в рамках определенного bashсеанса?

В идеале я бы хотел сказать что-то вроде:

$ prog1 &   
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &

и затем, например, kill %FOOзавершить только prog2и prog3.

решение1

Есть ли способ управлять группой заданий в рамках заданного сеанса bash?

Да, есть! - Используйте массивы для формирования групп, захватите каждый идентификатор процесса $!и добавьте его в массив.

$!этоспециальный параметр, указанный в POSIX, который выдает десятичный идентификатор процесса последней фоновой команды.

Ниже приведено руководство по добавлению элементов в массивы в Bash и их перечислению в контексте вашего вопроса:

Сначала объявим массивы:

$ GROUP_FOO=()
$ GROUP_BAR=()

Работа, которая не входит в группу:

$ prog1 &

Задание для добавления в группу FOO ( +=обозначение указывает на то, что значение должно быть добавлено в массив):

$ prog2 &
$ GROUP_FOO+=($!)

Еще одна работа в группе FOO:

$ prog3 &
$ GROUP_FOO+=($!)

Работа в группе BAR:

$ prog4 &
$ GROUP_BAR+=($!)

Чтобы завершить групповые процессы FOO:

$ for id in ${GROUP_FOO[@]}; do kill $id; done

Скриптовая версия

Если бы я писал этот скрипт, я бы немного изменил его так, чтобы идентификатор процесса добавлялся в массив только в случае успешного запуска:

prog2 & sleep 0.1; kill -0 $! && GROUP_FOO+=($!)

Таким образом, у вас будет меньше шансов иметь в массиве идентификаторы процессов, которые не выполняются, потому что они немедленно завершились с ошибкой. Задержка сна в 0,1 секунды (вероятно, даже может быть 0,01 секунды) дает процессу время для завершения с кодом ошибки.

Связанный контент