Sur la base d'un post de PSkocik ... Ci joint un exemple de script shell qui parallélise des traitements en en limitant le nombre (un intérêt étant de ne pas tomber sur les limitations système - par exemple le nombre de processus actifs - ou tout simplement de ne pas effondrer le serveur !).
Ce n'est pas parfait, car dans un groupe de traitement on attendra la fin du plus long, mais c'est simple à mettre en place.
Dans cet exemple l'écriture du log de chaque traitement se
fait dans un fichier temporaire distinct - puis est affiché ...
monTraitementAParalleliser() {
local fLOG="${LOG}/monTraitement.${i}.log"
date > "${fLOG}" 2>&1
echo "Hello ${1} ..." >> "${fLOG}" 2>&1
CODE_RETOUR=$?
sleep 3 # Pour faire durer
[ ${CODE_RETOUR} -gt 0 ] && touch "${TMP}/monTraitement.err"
cat "${fLOG}"
rm -f "${fLOG}"
}
# Début du script
rm -f "${TMP}/monTraitement.err"
# Nombre de parallelisations
N=3
# Indice
i=0
for PARAM in Henri Albert David John Felix Richard
do
# tous les N jobs, attente de fin des jobs
i=$(($i%$N)); [ $i -eq 0 ] && wait ;i=$(($i+1));
# Execution en parallele
echo "Declenchement du traitement pour ${PARAM}"
monTraitementAParalleliser "${PARAM}" &
done
# Attente de fin des derniers jobs
wait
if [ -f "${TMP}/monTraitement.err" ]; then
rm -f "${TMP}/monTraitement.err"
exit 1
fi
exit 0
Aucun commentaire:
Enregistrer un commentaire