Назад | Перейти на главную страницу

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

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