Bonjour,

j'ai un script qui lance des traitements sur un serveur (1 à n traitements). Ces traitements sont lancés en parallèle selon un maximum ($maxParallele) qui est positionné à 5 aujourd'hui. Quand un bloc de 5 traitements est terminé, le script lance les 5 suivants. Voici mon code simplifié :

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
34
35
36
37
38
39
40
41
42
43
44
function fctWait {
    # On wait les processus fils
    wait
    # Si il y a une écriture dans le fichier  des codes retour c'est qu'au moins un processus fils a planté donc on sort en erreur
    if [ -f ${fichierCodeRetour} ] && [ -s ${fichierCodeRetour} ];then
        return 1
    fi
    return 0
}
 
function fctExit {
    # On positionne un flag d'erreur dans le fichier des codes retour et on sort en erreur
    echo "1" >> ${fichierCodeRetour}
 
    fctPrintLog "$1"
    exit 1
}
 
export PID=$$
typeset nTraitement=0
typeset maxParallele=5
export fichierCodeRetour="${root}/fichierCodeRetour_`date +"%Y%m%d"`_${PID}.tmp"
> ${fichierCodeRetour}
 
while read traitement
do     
    # Si on est au max parallèle on wait et on remet les compteurs à 0
    if [[ "${nTraitement}" -ge "${maxParallele}" ]]; then
        fctWait ${fichierCodeRetour}
        [[ $? -ne 0 ]] && fctExit "ERREUR - Traitement interrompu (wait)"
        nTraitement=0
    fi
 
    {
        [...traitement...]
    } &
 
    ((nTraitement+=1))
 
done < ${fichierDesTraitements}
 
# On wait le dernier traitement de la boucle
fctWait ${fichierCodeRetour}
[[ $? -ne 0 ]] && fctExit "ERREUR - Traitement interrompu (wait)"
Je boucle sur un fichier qui contient mes traitements : ${fichierDesTraitements}, je lance 5 processus fils, dès que les 5 sont terminés (wait) je lance les 5 suivants. Si au moins un des fils plante, j'attends que les autres en parallèle se terminent et je stop le script, je ne lance pas les 5 suivants. Pour cela quand un fils sort en erreur je positionne un flag dans un fichier partagé que je vais lire dans la fonction fctWait juste après le wait avant d'éventuellement relancer un bloc.

Cela tourne en production et fonctionne parfaitement ! j'aimerais maintenant optimiser ce fonctionnement et avoir toujours 5 traitements en parallèle. Je lance 5 processus, un se termine, j'en relance un directement pour en avoir toujours 5 qui tournent. Par contre je veux garder l’arrêt en cas d'erreur. Un processus fils plante, je laisse terminer ceux en cours mais je n'en lance pas un nouveau.

j'ai fouillé un peu sur le net mais ça a l'air plus compliqué à gérer... Si vous avez des bouts de code ou des idées je suis preneur

Merci de votre aide.