Есть ли способ контролировать группу заданий в рамках заданного bash
сессия?
В идеале я хотел бы сказать что-то вроде:
$ prog1 &
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &
а затем, например, kill %FOO
прекратить только prog2
и prog3
.
Есть ли способ управлять группой заданий в рамках данного сеанса bash?
Да, есть! - Используйте массивы для формирования групп и фиксируйте каждый идентификатор процесса с помощью $!
и добавьте его в массив.
$!
это специальный параметр, указанный в POSIX, который дает десятичный идентификатор процесса последней фоновой команды.
Ниже приведено руководство о том, как добавлять массивы в Bash и перечислять их в контексте вашего вопроса:
Сначала объявите массивы:
$ GROUP_FOO=()
$ GROUP_BAR=()
Работа, не входящая в группу:
$ prog1 &
Работа идти в группу FOO ( +=
обозначение указывает, что значение должно быть добавлено к массиву):
$ prog2 &
$ GROUP_FOO+=($!)
Еще одна работа в группе FOO:
$ prog3 &
$ GROUP_FOO+=($!)
Работа в группе БАР:
$ 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 секунды) дает процессу время для выхода с кодом ошибки.