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 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