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