18 avril 2017

Linux : faire passer en arriere plan le job Unix en cours

Dans le cas où vous avez lancé sous Unix un traitement en avant plan ... mais qu'il est encore actif alors que l'heure de couper la connexion approche !

Sous les systèmes Linux vous pouvez faire passer le traitement en arrière plan :
  1. Taper "[ctrl]Z" ... le traitement est suspendu,
  2. Taper "bg" ... le traitement passe en arrière plan,
  3. Taper "disown" ... le traitement est retiré de la liste des jobs actifs 
Cette dernière opération permet de fermer la session sans que le traitement (rattaché initialement à la session SSH) soit tué.


/hradev/txt/tmp> monScript.sh > $LOG/monScript.log 2>&1
^Z

[1] + Stopped                  monScript.sh

/hradev/txt/tmp> jobs
[1] + Stopped                 
monScript.sh

/hradev/txt/tmp> bg
[1]    
monScript.sh& 
/hradev/txt/tmp> jobs
[1] +  Running                
monScript.sh

/hradev/txt/tmp> exit
You have running jobs
 
/hradev/txt/tmp> disown
/hradev/txt/tmp> exit

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