Wait conditionné au nombre de processus
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:
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.