Estoy tratando de crear un script que iniciará muchos comandos de fondo. Para cada comando de fondo, necesito obtener el código de retorno.
He estado probando el siguiente script:
#!/bin/bash
set -x
pid=()
return=()
for i in 1 2
do
echo start $i
ssh mysql "/root/test$i.sh" &
pid[$i]=$!
done
for i in ${#pid[@]}
do
echo ${pid[$i]}
wait ${pid[$i]}
return[$i]=$?
if [ ${return[$i]} -ne 0 ]
then
echo mail error
fi
done
echo ${return[1]}
echo ${return[2]}
Mi problema es durante el ciclo de espera, si el segundo pid termina antes del primero, no podré obtener el código de retorno.
Sé que puedo ejecutar wait pid1 pid2, pero con este comando no puedo obtener el código de retorno de todos los comandos.
Alguna idea ?
La respuesta de Stéphane es buena, pero preferiría
que iterará sobre las teclas de la
pid
matriz, independientemente de las entradas que aún existan, para que pueda adaptarlo, salir del ciclo y reiniciar todo el ciclo y simplemente funcionará. Y no necesita valores consecutivos dei
para empezar.Por supuesto, si está lidiando con miles de procesos, entonces quizás el enfoque de Stépane sería fraccionalmente más eficiente cuando tenga una lista no dispersa.
fuente