Controla os trabalhos de bash como um grupo?

1

Existe uma maneira de controlar um grupo de tarefas dentro de uma determinada bash sessão?

Idealmente, gostaria de dizer algo como:

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

e depois ter, e. kill %FOO termina apenas prog2 e prog3 .

    
por wodow 13.01.2017 / 13:02

1 resposta

1

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

Sim, existe! - Use matrizes para formar os grupos e capture cada ID de processo usando $! e anexe-a à matriz.

$! é um parâmetro especial especificado por POSIX , que fornece o decimal ID do processo do comando de segundo plano mais recente.

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

Primeiro, declare as matrizes:

$ GROUP_FOO=()
$ GROUP_BAR=()

Trabalho que não está em um grupo:

$ prog1 &

Trabalho para entrar no grupo FOO (a notação += indica que o valor deve ser anexado à matriz):

$ prog2 &
$ GROUP_FOO+=($!)

Outro trabalho para ir no grupo FOO:

$ prog3 &
$ GROUP_FOO+=($!)

Trabalho para entrar no grupo BAR:

$ prog4 &
$ GROUP_BAR+=($!)

Para matar os processos do grupo FOO:

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

Versão com script

Se eu estivesse criando scripts, alteraria um pouco para que o ID do processo seja adicionado apenas à matriz, se iniciado com êxito:

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

Dessa forma, você terá menos chances de ter IDs de processo em sua matriz que não estão sendo executados porque saíram imediatamente com um erro. O atraso de sono de 0,1 segundo (provavelmente pode ser de 0,01 segundo) dá tempo ao processo para sair com um código de erro.

    
por 13.01.2017 / 13:32

Tags