Obtener código de salida de subcapas que se ejecutan en paralelo

Obtener código de salida de subcapas que se ejecutan en paralelo

Intento crear un script de shell para iniciar una serie de procesos de larga duración. Llamémoslos a, b, c, d y e. Los procesos b, cyd deben ejecutarse en paralelo, y el proceso e debe ejecutarse después de que todos los anteriores hayan terminado.exitosamente.

Ahí está mi (pseudo)código:

{
    echo "starting a"
    a
}&&
{
    (echo "starting b"; b; exit $?)&
    (echo "starting c"; c; exit $?)&
    (echo "starting d"; d; exit $?)&
    wait
}&&
{
    echo "starting e"
    e
}

Mi problema es que si alguno de b, c, d falla, el script continúa y ejecuta e. Hay alguna manera de prevenir eso?

¡Muchas gracias por cualquier respuesta!

antonio

Respuesta1

{
    (echo "starting b"; b)&
    (echo "starting c"; c)&
    (echo "starting d"; d)&
    wait %1 && wait %2 && wait %3
}&&

cuando se espera un trabajo específico, waitse devuelve este código de salida de trabajos

Para entenderlo, mire estos dos ejemplos:
sólo la última línea es importante (muestra el estado de salida de wait)

(sleep 3; false) & wait; echo $?
[1] 25358
[1]+  Exit 1                  ( sleep 3; false )
0

--

(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+  Exit 1                  ( sleep 3; false )
1

Respuesta2

Al ejecutar un proceso en segundo plano, básicamente le ha dicho al shell que no está interesado en su éxito o fracaso.

wait voluntadinformar el valor de cualquier señal en su código de salida, si corresponde. Esto no es lo que estás buscando.

Una solución sería hacer que cada comando informe su estado a stdout y cuente las respuestas con grep.

{
  (echo "starting b"; b && echo ok)&
  (echo "starting c"; c && echo ok)&
  (echo "starting d"; d && echo ok)&
} | 
grep -c ok | ( read n && (( n==3 )) ) && 

{
echo "starting e"; e
}

información relacionada