el PID de un proceso hijo en segundo plano se almacena en $!. Puede almacenar todos los pids de procesos secundarios en una matriz, p. PIDS [].
wait [-n] [jobspec or pid …]
Esperar a que el proceso hijo especificado por cada proceso de identificación PID o el trabajo de especificación espectrab sale y devolver el estado de salida del último comando esperó.Si se proporciona una especificación de trabajo, se esperan todos los procesos en el trabajo. Si no se proporcionan argumentos, se esperan todos los procesos hijo actualmente activos y el estado de retorno es cero. Si se proporciona la opción -n, espera a que finalice cualquier trabajo y devuelve su estado de salida. Si ninguno espectrab ni PID especifica un proceso hijo activo de la cáscara, el estado de salida es 127.
Uso esperar comando puede esperar a que todos los procesos hijo acabado, por su parte puede obtener el código de salida de cada uno de los procesos secundarios y tienda estado en ESTADO []. Entonces puedes hacer algo dependiendo del estado.
He intentado el siguiente código y funciona bien.
#!/bin/bash
# start 3 child processes concurrently, and store each pid into PIDS[].
i=0
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
pid=$!
PIDS[$i]=${pid}
((i+=1))
done
# wait for all processes to finish, and store each process's exit code into STATUS[].
i=0
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS[$i]=$?
((i+=1))
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "failed"
else
echo "finish"
fi
((i+=1))
done
... y el ganador es? – TrueY