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