
Existe uma maneira de controlar um grupo de trabalhos em uma determinada bash
sessão?
Idealmente, eu gostaria de dizer algo como:
$ prog1 &
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &
e então, por exemplo, kill %FOO
termine apenas prog2
e 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.