123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #!/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 $?
|