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