14 avril 2017

Boucle Unix de traitements parallélisés

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