Bash ejecución paralela y código de salida
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
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
Gracias a todos por sus respuestas.
Siguiendo la Mark Setchell
sugerencia, 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