|
@@ -0,0 +1,118 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+#------------------- CHECKPOINT ---------------------------
|
|
|
+
|
|
|
+#
|
|
|
+# exemple de programme qui vient illustrer le cas décrit :
|
|
|
+# https://www-calculco.univ-littoral.fr/utilisation/lancer-un-calcul#h2-2-oardel
|
|
|
+
|
|
|
+# commande: oarsub -S ./checkpoint-user1bis.oar
|
|
|
+
|
|
|
+# cet exemple reprend l'exemple exemple 1 (checkpoint-user1.oar)
|
|
|
+# avec un programmer timer de 4mn
|
|
|
+# simplement c'est l'utilisateur qui déclencle le checkpoint
|
|
|
+# en supprimant son job avec la commande:
|
|
|
+
|
|
|
+# oardel -c -s SIGUSR2 XXXXX, où XXXX est le n° du job (JobID)
|
|
|
+#
|
|
|
+
|
|
|
+# Le checkpoint crée le fichier context_compteur.txt. Relancer le
|
|
|
+# script OAR ultérieurement entraîne un reprise du programme à
|
|
|
+# partir de ce contexte.
|
|
|
+
|
|
|
+#
|
|
|
+#-------------- paramètres OAR---------------------------
|
|
|
+#OAR -l cpu=1/core=1,walltime=00:5:00
|
|
|
+#OAR -n checkpoint-user1bis
|
|
|
+
|
|
|
+# Les fichiers de sortie sans paramètres $OAR_JOBID
|
|
|
+# (=> les jobs successifs écrivent dans les mêmes fichiers)
|
|
|
+#OAR -O OAR-ckpt-user1bis.out
|
|
|
+#OAR -E OAR-ckpt-user1bis.err
|
|
|
+
|
|
|
+#OAR -q default
|
|
|
+
|
|
|
+
|
|
|
+#IMPORTANT:
|
|
|
+# - par NFS: a priori pas de problème
|
|
|
+# - sur SCRATCH : il faut reprendre sur la même machine
|
|
|
+# par exemple :
|
|
|
+##OAR -p network_address = 'orval08'
|
|
|
+## besteffort est optionnel
|
|
|
+#OAR -t besteffort
|
|
|
+
|
|
|
+# signal envoyé par OAR (SIGUSR2)
|
|
|
+#OAR --signal 12
|
|
|
+
|
|
|
+#---------- la tâche à exécuter ------------------------
|
|
|
+# compilation ( peut être commenté si déjà compilé)
|
|
|
+gcc compteur4mn.c -o timer4mn
|
|
|
+# Note (compteur4mn.c): gère son propre checkpoint (SIGINT)
|
|
|
+#----------- pré-traitement -----------------------------
|
|
|
+# DWTFYW !
|
|
|
+echo "Debut du job ${OAR_JOB_ID}"
|
|
|
+
|
|
|
+#----------- lancement de la tâche ----------------------
|
|
|
+./timer4mn &
|
|
|
+
|
|
|
+#---------------------------------------------------------
|
|
|
+# gestion de signaux
|
|
|
+#---------------------------------------------------------
|
|
|
+# Warning: c'est le script OAR qui reçoit le signal 12!
|
|
|
+# => il faut le capter et le transmettre au PROG
|
|
|
+####################################################
|
|
|
+
|
|
|
+# pid du programme = pid de la dernière commande (: ./timer10mn)
|
|
|
+
|
|
|
+PROGPID=$!
|
|
|
+
|
|
|
+echo "le PROG PID est : $PROGPID"
|
|
|
+
|
|
|
+# fonction de traitement du signal OAR
|
|
|
+sighandler() {
|
|
|
+ echo "reception checkpoint OAR (signal12)"
|
|
|
+ # demande de checkpoint (-c) au programme
|
|
|
+ # SIGINT = 2 = "CRTL + C" (cf compteur10mn.c)
|
|
|
+ kill -s 2 $PROGPID
|
|
|
+ # IMPORTANT: pause (creation du fichier contexte)
|
|
|
+ sleep 5
|
|
|
+ [ -n "$PROGPID" ] && kill -9 $PROGPID
|
|
|
+ SCRIPT_CHECKPOINTED="YES"
|
|
|
+ echo "checkpoint : $SCRIPT_CHECKPOINTED"
|
|
|
+ }
|
|
|
+
|
|
|
+# signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici
|
|
|
+# à 12 par le paramètre --signal 12 (cf. param OAR au début)
|
|
|
+CHKPNT_SIGNAL=12
|
|
|
+
|
|
|
+# valeur de sortie en cas de checlpoint :
|
|
|
+# on laisse la valeur 99 nécessaire à l'option "--idempotent"
|
|
|
+# (restart automatique)
|
|
|
+# Dans le cas manuel, cette valeur peut être autre, l'important
|
|
|
+# est d'en fixer une pour sortir du programme sans aller à la fin
|
|
|
+# du script OAR (sinon le contexte est suppimé . cf les dernières lignes)
|
|
|
+EXIT_UNFINISHED=99
|
|
|
+
|
|
|
+# si le script OAR reçoit le SIGUSR2 (signal 12), checkpoint!
|
|
|
+
|
|
|
+# indique au script OAR de capter le signal 12
|
|
|
+trap sighandler $CHKPNT_SIGNAL
|
|
|
+
|
|
|
+# wait indispensable pour maintien des communucations
|
|
|
+# (signaux) entre ce script et le PROG
|
|
|
+while kill -0 "$PROGPID" 2>/dev/null; do
|
|
|
+ wait $PROGPID
|
|
|
+done
|
|
|
+
|
|
|
+# sortir ici ( sinon suppression du fichier context_compteur.txt )
|
|
|
+[ -n "$SCRIPT_CHECKPOINTED" ] && exit $EXIT_UNFINISHED
|
|
|
+
|
|
|
+#---------------------------------------------------------
|
|
|
+# fin du programme: postraitement
|
|
|
+#---------------------------------------------------------
|
|
|
+# DWTFYW!
|
|
|
+echo " ---post treatement---"
|
|
|
+echo " ...suppression du fichier temporaire context_compteur.txt"
|
|
|
+rm -f context_compteur.txt
|
|
|
+echo " c'est FINI ! "
|
|
|
+exit $?
|