|
@@ -8,7 +8,7 @@
|
|
|
|
|
|
# commande: oarsub -S ./checkpoint-user1.oar
|
|
# commande: oarsub -S ./checkpoint-user1.oar
|
|
|
|
|
|
-# Cet exemple est arrêté 2 fois ( 3 jobs consécutifs pour finir)
|
|
|
|
|
|
+# Cet exemple est arrêté 1 fois ( 2 jobs consécutifs pour finir)
|
|
|
|
|
|
#
|
|
#
|
|
# IMPORTANT:
|
|
# IMPORTANT:
|
|
@@ -22,8 +22,8 @@
|
|
#
|
|
#
|
|
# Le programme associé à ce script est un simple compteur
|
|
# Le programme associé à ce script est un simple compteur
|
|
# ( 1 incrémentation / secondes ) en C.
|
|
# ( 1 incrémentation / secondes ) en C.
|
|
-# - son excécution dur 10 mn
|
|
|
|
-# - ce script OAR, pour l'exemple, ne prévoit que 5mn (trop court!)
|
|
|
|
|
|
+# - son exécution (normal) dure 4 mn
|
|
|
|
+# - ce script OAR, pour l'exemple, ne prévoit que 3mn30 (trop court!)
|
|
# - le script OAR reçoit (d'OAR) le signal checkpoint 12.
|
|
# - le script OAR reçoit (d'OAR) le signal checkpoint 12.
|
|
# Il renvoit le signal 2 (SIGINT) au programme timer
|
|
# Il renvoit le signal 2 (SIGINT) au programme timer
|
|
# - À réception de ce dernier (interruption) le timer sauve
|
|
# - À réception de ce dernier (interruption) le timer sauve
|
|
@@ -31,8 +31,8 @@
|
|
# - timer10mn est arrêté mais est relancé par OAR
|
|
# - timer10mn est arrêté mais est relancé par OAR
|
|
#
|
|
#
|
|
#-------------- paramètres OAR---------------------------
|
|
#-------------- paramètres OAR---------------------------
|
|
-#OAR -l cpu=1/core=1,walltime=00:5:00
|
|
|
|
-#OAR -n start_and_restart
|
|
|
|
|
|
+#OAR -l cpu=1/core=1,walltime=00:3:30
|
|
|
|
+#OAR -n checkpoint-user1
|
|
|
|
|
|
# Les fichiers de sortie sans paramètres $OAR_JOBID
|
|
# Les fichiers de sortie sans paramètres $OAR_JOBID
|
|
# (=> les jobs successifs écrivent dans les mêmes fichiers)
|
|
# (=> les jobs successifs écrivent dans les mêmes fichiers)
|
|
@@ -41,11 +41,6 @@
|
|
|
|
|
|
#OAR -q default
|
|
#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
|
|
## besteffort est optionnel
|
|
#OAR -t besteffort
|
|
#OAR -t besteffort
|
|
## idempotent ne l'est pas
|
|
## idempotent ne l'est pas
|
|
@@ -60,14 +55,14 @@
|
|
|
|
|
|
#---------- la tâche à exécuter ------------------------
|
|
#---------- la tâche à exécuter ------------------------
|
|
# compilation ( peut être commenté si déjà compilé)
|
|
# compilation ( peut être commenté si déjà compilé)
|
|
-gcc compteur10mn.c -o timer10mn
|
|
|
|
-# Note (compteur10mn.c): gère son propre checkpoint (SIGINT)
|
|
|
|
|
|
+gcc compteur4mn.c -o timer4mn
|
|
|
|
+# Note (compteur4mn.c): gère son propre checkpoint (SIGINT)
|
|
#----------- pré-traitement -----------------------------
|
|
#----------- pré-traitement -----------------------------
|
|
# DWTFYW !
|
|
# DWTFYW !
|
|
echo "Debut du job ${OAR_JOB_ID}"
|
|
echo "Debut du job ${OAR_JOB_ID}"
|
|
|
|
|
|
#----------- lancement de la tâche ----------------------
|
|
#----------- lancement de la tâche ----------------------
|
|
-./timer10mn &
|
|
|
|
|
|
+./timer4mn &
|
|
|
|
|
|
#---------------------------------------------------------
|
|
#---------------------------------------------------------
|
|
# gestion de signaux
|
|
# gestion de signaux
|
|
@@ -78,7 +73,22 @@ echo "Debut du job ${OAR_JOB_ID}"
|
|
|
|
|
|
# pid du programme = pid de la dernière commande (: ./timer10mn)
|
|
# pid du programme = pid de la dernière commande (: ./timer10mn)
|
|
|
|
|
|
-PID=$!
|
|
|
|
|
|
+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
|
|
|
|
+ sleep 4
|
|
|
|
+ [ -n "$PROGPID" ] && kill -9 $PROGPID
|
|
|
|
+ SCRIPT_CHECKPOINTED="YES"
|
|
|
|
+ echo "checkpoint : $SCRIPT_CHECKPOINTED"
|
|
|
|
+ }
|
|
|
|
|
|
# signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici
|
|
# signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici
|
|
# à 12 par le paramètre --signal 12 (cf. param OAR au début)
|
|
# à 12 par le paramètre --signal 12 (cf. param OAR au début)
|
|
@@ -90,21 +100,16 @@ EXIT_UNFINISHED=99
|
|
|
|
|
|
# si le script OAR reçoit le SIGUSR2 (signal 12), checkpoint!
|
|
# si le script OAR reçoit le SIGUSR2 (signal 12), checkpoint!
|
|
|
|
|
|
-# Rq tentative d'envoyer le même signal au prog: ne fonctione pas!?
|
|
|
|
-# SIGUSR2 = 12 kill rééllement le programme :
|
|
|
|
-# => pas de checkpoint
|
|
|
|
-# => boucle infinie!
|
|
|
|
-
|
|
|
|
-# Du coup:
|
|
|
|
-# SIGINT = 2 = "CRTL + C" fonctionne
|
|
|
|
-trap "echo commande trap (script OAR); kill -s 2 $PID ; exit $EXIT_UNFINISHED" $CHKPNT_SIGNAL
|
|
|
|
-#
|
|
|
|
|
|
+# indique au script OAR de capter le signal 12
|
|
|
|
+trap sighandler $CHKPNT_SIGNAL
|
|
|
|
|
|
-# obliger le script OAR à attendre l'exécution du PROG
|
|
|
|
-# (sinon il s'exécute jusqu'au bout et ne récupérera
|
|
|
|
-# jamais le signal checkpoint !)
|
|
|
|
|
|
+# wait indispensable pour maintien des communucations
|
|
|
|
+# (signaux) entre ce script et le PROG
|
|
|
|
+while kill -0 "$PROGPID" 2>/dev/null; do
|
|
|
|
+ wait $PROGPID
|
|
|
|
+done
|
|
|
|
|
|
-wait $PID
|
|
|
|
|
|
+[ -n "$SCRIPT_CHECKPOINTED" ] && exit 99
|
|
|
|
|
|
#---------------------------------------------------------
|
|
#---------------------------------------------------------
|
|
# fin du programme: postraitement
|
|
# fin du programme: postraitement
|