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 :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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Partager