123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #!/bin/bash
- #------------------- CHECKPOINT DMTCP ex2 ---------------------------
- #
- # Ce programme fait suite à l'exemple checkpoint-dmtcp1.oar.
- # le programme est "trop long", un système de checkpoint/restart
- # est bienvenu :
- # - pour tenir dans la queue "default" ( trop de ressources )
- # - par sécurité ( ne pas repartir de zéro en cas de ...?
- # - parce que, contrairement à l'ex. checkpoint-user1.oar, la
- # gestion du checkpoint au sein du programme utilisateur
- # (sauvegarde de tout le contexte, est trop compliqué)
- # commande: oarsub -S ./checkpoint-dmtcp2.oar
- # PRINCIPE:
- # Dans cette exemple, le cycle start/checkpoint/restart jusqu' à la fin
- # du job est automatique:
- # - le programme est lancé via dmtcp_launch ./PROG
- # - OAR est lancé avec l'option checkpoint
- # - le signal checkpoint OAR déclenche le checkpoint de PROG via dmtcp
- # (génère le fichier ckpt_xxxxxxx et le script dmtp_restart_script_.sh)
- # - l'option idempotent (OAR) relance dmtcp_restart_script.sh
- # - le tout, autant de fois que nécessaire
- # infos: http://dmtcp.sourceforge.net/
- #-------------- paramètres OAR---------------------------
- # walltime de 6mn ( donc trop court pour le prog/timer de 10mn)
- #OAR -l cpu=1/core=1,walltime=00:6:00
- #OAR -n dmtcp_ex2
- # Les fichiers de sortie sans paramètres $OAR_JOBID
- # (=> les jobs successifs écrivent dans les mêmes fichiers)
- #OAR -O OAR-ckpt-dmtcp2.out
- #OAR -E OAR-ckpt-dmtcp2.err
- #OAR -q default
- # À supprimer (détailler?)
- #OAR -p network_address = 'orval08'
- #OAR -t besteffort
- #OAR -t idempotent
- # checkpoint OAR 60 s avant le walltime (donc ~4mn)
- # Pour un exemple réel ( plusieurs heures, gros contexte, 600s (10mn))
- #OAR --checkpoint 60
- # signal envoyé par OAR (SIGUSR2)
- #OAR --signal 12
- # chargement du modeul dmtcp
- source /nfs/opt/env/env.sh
- module load dmtcp
- #---------- la tâche à exécuter ------------------------
- # compilation ( )
- gcc simpleCompteur10mn.c -o stimer10mn
- #----------- pré-traitement -----------------------------
- # DWTFYW !
- echo "Debut du jobs ou restart ?"
- # lancement du programme, récupération du PID
- if [ -f dmtcp_restart_script.sh ]; then
- echo " -> reprise du job "
- ./dmtcp_restart_script.sh &
- PROGPID=$!
- else
- echo " -> Debut du jobs"
- dmtcp_launch ./stimer10mn &
- PROGPID=$!
- fi
- #---------------------------------------------------------
- # gestion du checkpoint OAR
- #---------------------------------------------------------
- # fonction de traitement du signal OAR
- sighandler() {
- echo "reception checkpoint OAR (signal12)"
- # demande de checkpoint (-c) au coordinateur dmtcp
- dmtcp_command -c
- sleep 5
- [ -n "$PROGPID" ] && kill -9 $PROGPID
- SCRIPT_CHECKPOINTED="YES"
- }
- # 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 pour l'option "--idempotent"
- # (restart automatique) )
- EXIT_UNFINISHED=99
- # 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
- # important : le code 99 doit être retourné pour que l'option
- # idempotent ( relance auto.) soit effective
- [ -n "$SCRIPT_CHECKPOINTED" ] && exit 99
- #---------------------------------------------------------
- # fin du programme: postraitement
- #---------------------------------------------------------
- # DWTFYW!
- echo "---post treatement---"
- # suppression des ckpt
- echo "c'est FINI (10mn)! ... suppression des checkpoints"
- rm ckpt_*.dmtcp dmtcp_restart_script*
- # => idempotent devrait entraîner un redémarrage auto.
- exit $?
|