¿Cómo esperar en bash a que finalicen varios subprocesos y devolver el código de salida! = 0 cuando cualquier subproceso finaliza con el código! = 0?
¿Cómo esperar en un script bash a que finalicen varios subprocesos generados a partir de ese script y luego devolver el código de salida !=0
cuando cualquiera de los subprocesos finaliza con el código !=0
?
Guión sencillo:
#!/bin/bash
for i in `seq 0 9`; do
doCalculations $i &
done
wait
El script anterior esperará los 10 subprocesos generados, pero siempre dará el estado de salida 0
(ver help wait
). ¿Cómo puedo modificar este script para que descubra los estados de salida de los subprocesos generados y devuelva el código de salida 1
cuando cualquiera de los subprocesos finalice con código !=0
?
¿Existe alguna solución mejor para eso que recopilar los PID de los subprocesos, esperarlos en orden y sumar los estados de salida?
wait
también (opcionalmente) toma el PID
proceso a esperar y $!
obtiene el PID
último comando iniciado en segundo plano. Modifique el bucle para almacenar PID
cada subproceso generado en una matriz y luego vuelva a realizar el bucle esperando cada uno PID
.
# run processes and store pids in array
for i in $n_procs; do
./procs[${i}] &
pids[${i}]=$!
done
# wait for all pids
for pid in ${pids[*]}; do
wait $pid
done
http://jeremy.zawodny.com/blog/archives/010717.html :
#!/bin/bash
FAIL=0
echo "starting"
./sleeper 2 0 &
./sleeper 2 1 &
./sleeper 3 0 &
./sleeper 2 0 &
for job in `jobs -p`
do
echo $job
wait $job || let "FAIL+=1"
done
echo $FAIL
if [ "$FAIL" == "0" ];
then
echo "YAY!"
else
echo "FAIL! ($FAIL)"
fi
Aquí hay un ejemplo simple usando wait
.
Ejecute algunos procesos:
$ sleep 10 &
$ sleep 10 &
$ sleep 20 &
$ sleep 20 &
Luego espéralos con wait
el comando:
$ wait < <(jobs -p)
O simplemente wait
(sin argumentos) para todos.
Esto esperará a que se completen todos los trabajos en segundo plano.
Si -n
se proporciona la opción, espera a que finalice el siguiente trabajo y devuelve su estado de salida.
Ver: help wait
y help jobs
para la sintaxis.
Sin embargo, la desventaja es que esto devolverá solo el estado del último ID, por lo que debe verificar el estado de cada subproceso y almacenarlo en la variable.
O haga que su cálculo funcione para crear algún archivo en caso de falla (vacío o con registro de fallas), luego verifique ese archivo si existe, por ejemplo
$ sleep 20 && true || tee fail &
$ sleep 20 && false || tee fail &
$ wait < <(jobs -p)
$ test -f fail && echo Calculation failed.