
¿Existe alguna manera de controlar un grupo de trabajos dentro de una bash
sesión determinada?
Idealmente, me gustaría decir algo como:
$ prog1 &
$ GROUP=FOO prog2 &
$ GROUP=FOO prog3 &
$ GROUP=BAR prog4 &
y luego, por ejemplo, kill %FOO
terminar solo prog2
y 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.