Controlar trabalhos bash como um grupo?

Controlar trabalhos bash como um grupo?

Existe uma maneira de controlar um grupo de trabalhos em uma determinada bashsessão?

Idealmente, eu gostaria de dizer algo como:

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

e então, por exemplo, kill %FOOtermine apenas prog2e prog3.

Responder1

Existe uma maneira de controlar um grupo de trabalhos em uma determinada sessão do bash?

Sim existe! - Use arrays para formar os grupos e capture cada ID de processo usando $!e anexe-o ao array.

$!é umparâmetro especial especificado pelo POSIX, que fornece o ID do processo decimal do comando em segundo plano mais recente.

Abaixo está um tutorial de como anexar arrays no Bash e enumerá-los no contexto da sua pergunta:

Primeiro declare os arrays:

$ GROUP_FOO=()
$ GROUP_BAR=()

Trabalho que não está em grupo:

$ prog1 &

Trabalho a ser inserido no grupo FOO (a +=notação indica que o valor deve ser anexado ao array):

$ prog2 &
$ GROUP_FOO+=($!)

Outro trabalho para ir no grupo FOO:

$ prog3 &
$ GROUP_FOO+=($!)

Trabalho a ser realizado no grupo BAR:

$ prog4 &
$ GROUP_BAR+=($!)

Para encerrar os processos do grupo FOO:

$ for id in ${GROUP_FOO[@]}; do kill $id; done

Versão com script

Se eu estivesse fazendo o script, alteraria um pouco para que o ID do processo só fosse adicionado à matriz se fosse iniciado com êxito:

prog2 & sleep 0.1; kill -0 $! && GROUP_FOO+=($!)

Dessa forma, você terá menos probabilidade de ter IDs de processos em sua matriz que não estão em execução porque foram encerrados imediatamente com um erro. O atraso de suspensão de 0,1 segundo (provavelmente pode ser de 0,01 segundo) dá ao processo tempo para sair com um código de erro.

informação relacionada