Lancer un nombre limité de sous-shells en parrallèle
Bonjour,
Voilà, j'ai un script qui lit l'entré standard et qui effectue un traitement sur chaque ligne. Mais comme lors de ce traitement il y a souvent un temps d'attente (ça dépend du réseau) j'ai envie de réaliser plusieurs traitement en même temps.
Mon script est donc censé lancer 10 sous-shells et pas un de plus.
Or, manifestement il en lance beaucoup plus.
Voilà le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #!/bin/sh
while read P; do
libre=-1
# On recommence tant qu'il n'y a pas eut de place libre
while [ $libre -eq -1 ]; do
# On fait le ménage
for ((i=0; $i<10; i=$(($i+1)))); do
if [[ ${tpid[$i]} -ne 0 && `ps -e | awk '{print $1}' | grep -c $tpid[$i]` -eq 0 ]]; then
tpid[$i]=0;
fi
done
# On cherche une place libre et on défini laquelle c'est
for ((i=0; $i<10; i=$(($i+1)))); do
if [[ ${tpid[$i]} -eq 0 ]]; then
libre=$i;
break
fi
done
# si on en a pas trouvé de libre, on attend 0.5 secondes
if [ $libre -eq -1 ]; then
sleep 0.5
fi
done
(
# blabla je m'occupe de $P
) &
tpid[$libre]=$!
done |
Voilà, l'idée c'était de stoquer dans le tableau tpid la liste des pid des sous-shells en cours, de relancer le traitement si il y a une place de libre dans ce tableau, et de faire le ménage de temps en enlevant du tableau les pid des sous-shells qui se sont terminés.
Mon idée de départ était beaucoup plus simple, il s'agissait d'avoir juste un compteur qui s'incrémente quand on lance un sous-shell, et qui se décrémente quand il se termine, puis relancer ou non un traitement en fonction du nombre de sous-shells en cours. Mais je n'ai pas trouvé le moyen de décrémenter la variable quand il faut. :/
Donc si quelqu'un voit l'erreur dans mon code ou si il a une nouvelle idée je suis preneur.
Merci d'avance.