bash – Recopilar códigos de salida de procesos en segundo plano paralelos (subconjuntos)

Pregunta:

Digamos que tenemos un script bash como este:

echo "x" &
echo "y" &
echo "z" &
.....
echo "Z" &
wait

¿Hay alguna forma de recopilar los códigos de salida de los subprocesos / subprocesos? Buscando la forma de hacer esto y no puedo encontrar nada. Necesito ejecutar estas subcapas en paralelo, de lo contrario, sí, esto sería más fácil.

Estoy buscando una solución genérica (tengo un número desconocido / dinámico de subprocesos para ejecutar en paralelo).

Respuesta:

Use wait con un PID, que :

Espere hasta que el proceso hijo especificado por cada ID de proceso pid o especificación de trabajo jobpec salga y devuelva el estado de salida del último comando esperado.

Deberá guardar el PID de cada proceso a medida que avanza:

echo "x" & X=$!
echo "y" & Y=$!
echo "z" & Z=$!

También puede habilitar el control de trabajos en el script con set -m -my usar una especificación de trabajo %n , pero es casi seguro que no quiera hacerlo; el control de trabajos tiene muchos otros efectos secundarios .

wait devolverá el mismo código con el que finalizó el proceso. Puede usar wait $X en cualquier punto posterior (razonable) para acceder al código final como $? o simplemente utilícelo como verdadero / falso:

echo "x" & X=$!
echo "y" & Y=$!
...
wait $X
echo "job X returned $?"

wait hará una pausa hasta que el comando se complete si aún no lo ha hecho.

Si desea evitar un estancamiento así, puede colocar una trap en SIGCHLD , contar el número de terminaciones y manejar todas las wait a la vez cuando todas hayan terminado. Probablemente pueda salirse con la suya usando wait solo casi todo el tiempo.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım