Bash ejecución paralela y código de salida

Dec 31 2020

Me gustaría ejecutar varios comandos en paralelo en un script bash, pero si alguno de estos comandos falla (devuelve un código de salida distinto de cero), el código de salida del script debe ser distinto de cero.

He intentado usar sem(https://www.gnu.org/software/parallel/sem.html):

cat >script.sh <<EOF
sem -j+0 "sleep 2; echo 1"
sem -j+0 "sleep 4; exit 1; echo 2"
sem -j+0 "sleep 6; echo 3"
sem --wait
EOF
bash script.sh; echo $?

y solo fondo el proceso:

cat >script.sh <<EOF
{sleep 2; echo 1} &
{sleep 4; exit 1; echo 2} &
{sleep 6; echo 3} &
wait
EOF
bash script.sh; echo $?

En ambos casos, el código de salida general es siempre 0.

¿Algunas ideas?

Respuestas

2 KamilCuk Dec 31 2020 at 02:56

pero si alguno de estos comandos falla (devuelve un código de salida distinto de cero), el código de salida del script debe ser distinto de cero.

Así que escribe esa condición.

childs=();
{ sleep 0.2; echo 1 ;} &
childs+=($!); { sleep 0.4; exit 1; echo 2; } & childs+=($!);
{ sleep 0.6; echo 3; } &
childs+=($!); ret=0; for i in "${childs[@]}"; do
     if ! wait "$i"; then ret=1; fi done echo "ret=$ret"
exit "$ret"
2 yellowhat Dec 31 2020 at 15:23

Gracias a todos por sus respuestas.

Siguiendo la Mark Setchellsugerencia, creo que la mejor solución para mí es:

#!/bin/bash
set -euo pipefail

cat <<EOF | parallel --halt 1
date; sleep 2; date; echo -e "1\n"
date; sleep 4; exit 1; date; echo -e "2\n"
date; sleep 6; date; echo -e "3\n"
EOF