¿Controlar los trabajos de bash como grupo?

¿Controlar los trabajos de bash como grupo?

¿Existe alguna manera de controlar un grupo de trabajos dentro de una bashsesión determinada?

Idealmente, me gustaría decir algo como:

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

y luego, por ejemplo, kill %FOOterminar solo prog2y prog3.

Respuesta1

¿Existe alguna forma de controlar un grupo de trabajos dentro de una sesión de bash determinada?

¡Sí hay! - Utilice matrices para formar los grupos, capture cada ID de proceso $!y agréguelo a la matriz.

$!es unparámetro especial especificado por POSIX, que proporciona el ID del proceso decimal del comando en segundo plano más reciente.

A continuación se muestra un tutorial sobre cómo agregar matrices en Bash y enumerarlas en el contexto de su pregunta:

Primero declara las matrices:

$ GROUP_FOO=()
$ GROUP_BAR=()

Trabajo que no está en un grupo:

$ prog1 &

Trabajo para ir al grupo FOO (la +=notación indica que el valor debe agregarse a la matriz):

$ prog2 &
$ GROUP_FOO+=($!)

Otro trabajo para ir en el grupo FOO:

$ prog3 &
$ GROUP_FOO+=($!)

Trabajo para ir en grupo BAR:

$ prog4 &
$ GROUP_BAR+=($!)

Para finalizar los procesos del grupo FOO:

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

Versión con guión

Si estuviera escribiendo esto, lo modificaría ligeramente para que el ID del proceso solo se agregue a la matriz si se inicia correctamente:

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

De esa manera, será menos probable que tenga ID de proceso en su matriz que no se estén ejecutando porque salieron inmediatamente con un error. El retraso de suspensión de 0,1 segundos (probablemente podría ser incluso 0,01 segundos) le da tiempo al proceso para salir con un código de error.

información relacionada