J'essaie de créer un script qui lancera de nombreuses commandes d'arrière-plan. Pour chaque commande d'arrière-plan, j'ai besoin d'obtenir le code retour.
J'ai essayé le script suivant:
#!/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]}
Mon problème est pendant la boucle d'attente, si le deuxième pid se termine avant le premier, je ne pourrai pas obtenir le code retour.
Je sais que je peux exécuter wait pid1 pid2, mais avec cette commande, je ne peux pas obtenir le code retour de toutes les commandes.
Une idée ?
La réponse de Stéphane est bonne, mais je préférerais
qui itérera sur les clés du
pid
tableau, quelles que soient les entrées qui existent encore, vous pouvez donc l'adapter, sortir de la boucle et redémarrer la boucle entière et cela fonctionnera. Et vous n'avez pas besoin de valeurs consécutives dei
pour commencer.Bien sûr, si vous avez affaire à des milliers de processus, l'approche de Stépane serait peut-être légèrement plus efficace lorsque vous avez une liste non clairsemée.
la source