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é :
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.
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)"
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.
Partager