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 : 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
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.