123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- #!/bin/bash
- #------------------- CHECKPOINT DMTCP ex6 ---------------------------
- #
- #
- # commande: oarsub -S ./checkpoint-dmtcp-scratch-ex6.oar
- # L'exemple 6 met en oeuvre la possibilité d'effectuer un checkpoint
- # en travaillant sur le répertoire scratch ET avec une reprise
- # automatique (option idemtpotent) sur un nœud potentiellement
- # différent à chaque redémarrage.
- # - la seule difficulté est de récupérer les checkpoints sur le HOME_DIR
- # à chaque fin de run «avorté» (si le walltime est atteint)
- # - Pour la demo:
- # - le timer est de 20 minutes
- # - le walltime fixé à 10mn
- # - donc 3 runs avec l'option --checkpoint 120 (checkpoint 10mn-120s=8mn)
- #-------------- paramètres OAR---------------------------
- # walltime de 10min
- #OAR -l core=1,walltime=00:10:00
- #OAR -n dmtcp-scratch
- #les jobs successifs ecrivent dans des fichiers différents
- #OAR -O OAR-ckpt-dmtcp-ex6.%jobid%.out
- #OAR -E OAR-ckpt-dmtcp-ex6.%jobid%.err
- #OAR -q default
- # A EDITER apres consultation de :
- # https://www-calculco.univ-littoral.fr/outils_visu/drawgantt/
- # Si pour une raison d'architecture ( option de compilation)
- # il faut des hôtes/processeurs du même type, par ex:
- ##OAR -p nodemodel = 'Dell_R630'
- # ou:
- ##OAR -p nodemodel = 'Dell_R820'
- # au choix : default ou besteffort
- #OAR -t besteffort
- # pour une relance auto (c'est l'objectif!)
- #OAR -t idempotent
- # checkpoint OAR 120 s avant le walltime
- # Pour un exemple réel ( plusieurs heures, gros contexte, 600s (10mn))
- #OAR --checkpoint 120
- # chargement du module dmtcp
- source /nfs/opt/env/env.sh > /dev/null 2>&1
- module load dmtcp > /dev/null 2>&1
- #---------- la tâche à exécuter ------------------------
- # doit être contenu dans l'archive ./RUN_DIR.tgz
- PROG=timer20mn
- RUN_DIR=scratch-ex6
- #----------- pré-traitement -----------------------------
- GROUP=$(id -gn $OAR_USER)
- # Création du répertoire temporaire local dans scratch
- #SCRATCHDIR=/scratch/$GROUP/$OAR_USER/$OAR_JOB_NAME.$OAR_JOBID
- SCRATCHDIR=/scratch/$GROUP/$OAR_USER/$OAR_JOB_NAME
- [ ! -d $SCRATCHDIR ] && mkdir $SCRATCHDIR
- # Recopie de l'archive du programme (et éventuels checkpoints
- # et données des runs précendents) dans le répertoire
- cd $SCRATCHDIR
- # au 1er lancement, par exemple:
- # backup de l'archive dans le rép d'origine
- # (celle-ci est modifiée à chaque run car contient les checkpoints)
- if [ ! -f $OAR_WORKDIR/$RUN_DIR.tgz.ORG ]; then
- cp $OAR_WORKDIR/$RUN_DIR.tgz $OAR_WORKDIR/$RUN_DIR.tgz.ORG
- fi
- # copie sur le scratch
- cp $OAR_WORKDIR/$RUN_DIR.tgz .
- # deploiement de l'archive
- tar xzf $RUN_DIR.tgz
- # supression de l'archive
- rm $RUN_DIR.tgz
- cd $RUN_DIR
- # sur quel noeud sommes-nous?
- /bin/hostname
- echo "Debut du jobs ou restart ?"
- # si c'est une reprise
- if [ -f dmtcp_restart_script.sh ]; then
- LAST_HOST=`cat hostname.txt`
- # sur quel noeud ?
- /bin/hostname
- # si le dernier run était sur un autre noeud, modifier
- # le script de redémarrage
- if [ $(hostname) != $LAST_HOST ]; then
- echo " -> reprise du job sur autre noeud"
- NEW_HOST=`/bin/hostname`
- sed -i s/"$LAST_HOST"/"$NEW_HOST"/g dmtcp_restart_script.sh
- # optionnel (pour debug)
- cp hostname.txt hostname_last.txt
- # backup du nouvel hostname
- /bin/hostname > hostname.txt
- else
- echo "-> reprise sur le meme noeud"
- fi
- # relancer depuis le dernier checkpoint
- ./dmtcp_restart_script.sh &
- PROGPID=$!
- else
- echo " -> Debut du jobs"
- # sauvegarde du hostname
- /bin/hostname > hostname.txt
- dmtcp_launch ./timer20mn &
- 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
- # regroupement et ménage pour la relance du job
- # ---------------------------------------------
- mv $OAR_STDOUT .
- mv $OAR_STDERR .
- # archivage des fichiers :hosts, checkpoints ...
- cd ..
- tar czf $RUN_DIR.tgz ./$RUN_DIR
- # recopie sur $HOME
- mv $RUN_DIR.tgz $OAR_WORKDIR
- # menage
- cd ..
- rm -rf $SCRATCHDIR
- # suicide avant que LEON s'en occupe!
- [ -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 (ménage)
- echo "fin effective du programme, suppression des checkpoints"
- rm -f ckpt_*.dmtcp dmtcp_restart_script*
- # a supprimer?
- mv hostname.txt last_hostname.txt
- cd ..
- cp -rp $RUN_DIR $OAR_WORKDIR
- cd ..
- rm -rf $SCRATCHDIR
- # écrasement de la dernière archive intermédiaire par l'originale
- mv $OAR_WORKDIR/$RUN_DIR.tgz.OAR $OAR_WORKDIR/$RUN_DIR.tgz
- exit $?
|