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

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

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

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

и затем укажите, например, kill% FOO terminate only prog2 и prog3 .

1
задан 13 January 2017 в 14:02
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 секунды) дает процессу время для выхода с кодом ошибки.

1
ответ дан 3 December 2019 в 23:36

Теги

Похожие вопросы