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