checkpoint-dmtcp-scratch-ex6.oar 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #!/bin/bash
  2. #------------------- CHECKPOINT DMTCP ex6 ---------------------------
  3. #
  4. #
  5. # commande: oarsub -S ./checkpoint-dmtcp-scratch-ex6.oar
  6. # L'exemple 6 met en oeuvre la possibilité d'effectuer un checkpoint
  7. # en travaillant sur le répertoire scratch ET avec une reprise
  8. # automatique (option idemtpotent) sur un nœud potentiellement
  9. # différent à chaque redémarrage.
  10. # - la seule difficulté est de récupérer les checkpoints sur le HOME_DIR
  11. # à chaque fin de run «avorté» (si le walltime est atteint)
  12. # - Pour la demo:
  13. # - le timer est de 20 minutes
  14. # - le walltime fixé à 10mn
  15. # - donc 3 runs avec l'option --checkpoint 120 (checkpoint 10mn-120s=8mn)
  16. #-------------- paramètres OAR---------------------------
  17. # walltime de 10min
  18. #OAR -l core=1,walltime=00:10:00
  19. #OAR -n dmtcp-scratch
  20. #les jobs successifs ecrivent dans des fichiers différents
  21. #OAR -O OAR-ckpt-dmtcp-ex6.%jobid%.out
  22. #OAR -E OAR-ckpt-dmtcp-ex6.%jobid%.err
  23. #OAR -q default
  24. # A EDITER apres consultation de :
  25. # https://www-calculco.univ-littoral.fr/outils_visu/drawgantt/
  26. # Si pour une raison d'architecture ( option de compilation)
  27. # il faut des hôtes/processeurs du même type, par ex:
  28. ##OAR -p nodemodel = 'Dell_R630'
  29. # ou:
  30. ##OAR -p nodemodel = 'Dell_R820'
  31. # au choix : default ou besteffort
  32. #OAR -t besteffort
  33. # pour une relance auto (c'est l'objectif!)
  34. #OAR -t idempotent
  35. # checkpoint OAR 120 s avant le walltime
  36. # Pour un exemple réel ( plusieurs heures, gros contexte, 600s (10mn))
  37. #OAR --checkpoint 120
  38. # chargement du module dmtcp
  39. source /nfs/opt/env/env.sh > /dev/null 2>&1
  40. module load dmtcp > /dev/null 2>&1
  41. #---------- la tâche à exécuter ------------------------
  42. # doit être contenu dans l'archive ./RUN_DIR.tgz
  43. PROG=timer20mn
  44. RUN_DIR=scratch-ex6
  45. #----------- pré-traitement -----------------------------
  46. GROUP=$(id -gn $OAR_USER)
  47. # Création du répertoire temporaire local dans scratch
  48. #SCRATCHDIR=/scratch/$GROUP/$OAR_USER/$OAR_JOB_NAME.$OAR_JOBID
  49. SCRATCHDIR=/scratch/$GROUP/$OAR_USER/$OAR_JOB_NAME
  50. [ ! -d $SCRATCHDIR ] && mkdir $SCRATCHDIR
  51. # Recopie de l'archive du programme (et éventuels checkpoints
  52. # et données des runs précendents) dans le répertoire
  53. cd $SCRATCHDIR
  54. # au 1er lancement, par exemple:
  55. # backup de l'archive dans le rép d'origine
  56. # (celle-ci est modifiée à chaque run car contient les checkpoints)
  57. if [ ! -f $OAR_WORKDIR/$RUN_DIR.tgz.ORG ]; then
  58. cp $OAR_WORKDIR/$RUN_DIR.tgz $OAR_WORKDIR/$RUN_DIR.tgz.ORG
  59. fi
  60. # copie sur le scratch
  61. cp $OAR_WORKDIR/$RUN_DIR.tgz .
  62. # deploiement de l'archive
  63. tar xzf $RUN_DIR.tgz
  64. # supression de l'archive
  65. rm $RUN_DIR.tgz
  66. cd $RUN_DIR
  67. # sur quel noeud sommes-nous?
  68. /bin/hostname
  69. echo "Debut du jobs ou restart ?"
  70. # si c'est une reprise
  71. if [ -f dmtcp_restart_script.sh ]; then
  72. LAST_HOST=`cat hostname.txt`
  73. # sur quel noeud ?
  74. /bin/hostname
  75. # si le dernier run était sur un autre noeud, modifier
  76. # le script de redémarrage
  77. if [ $(hostname) != $LAST_HOST ]; then
  78. echo " -> reprise du job sur autre noeud"
  79. NEW_HOST=`/bin/hostname`
  80. sed -i s/"$LAST_HOST"/"$NEW_HOST"/g dmtcp_restart_script.sh
  81. # optionnel (pour debug)
  82. cp hostname.txt hostname_last.txt
  83. # backup du nouvel hostname
  84. /bin/hostname > hostname.txt
  85. else
  86. echo "-> reprise sur le meme noeud"
  87. fi
  88. # relancer depuis le dernier checkpoint
  89. ./dmtcp_restart_script.sh &
  90. PROGPID=$!
  91. else
  92. echo " -> Debut du jobs"
  93. # sauvegarde du hostname
  94. /bin/hostname > hostname.txt
  95. dmtcp_launch ./timer20mn &
  96. PROGPID=$!
  97. fi
  98. #---------------------------------------------------------
  99. # gestion du checkpoint OAR
  100. #---------------------------------------------------------
  101. # fonction de traitement du signal OAR
  102. sighandler() {
  103. echo "reception checkpoint OAR (signal12)"
  104. # demande de checkpoint (-c) au coordinateur dmtcp
  105. dmtcp_command -c
  106. sleep 5
  107. # regroupement et ménage pour la relance du job
  108. # ---------------------------------------------
  109. mv $OAR_STDOUT .
  110. mv $OAR_STDERR .
  111. # archivage des fichiers :hosts, checkpoints ...
  112. cd ..
  113. tar czf $RUN_DIR.tgz ./$RUN_DIR
  114. # recopie sur $HOME
  115. mv $RUN_DIR.tgz $OAR_WORKDIR
  116. # menage
  117. cd ..
  118. rm -rf $SCRATCHDIR
  119. # suicide avant que LEON s'en occupe!
  120. [ -n "$PROGPID" ] && kill -9 $PROGPID
  121. SCRIPT_CHECKPOINTED="YES"
  122. }
  123. # signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici
  124. # à 12 par le paramètre --signal 12 (cf. param OAR au début)
  125. CHKPNT_SIGNAL=12
  126. # valeur de sortie pour l'option "--idempotent"
  127. # (restart automatique) )
  128. EXIT_UNFINISHED=99
  129. # indique au script OAR de capter le signal 12
  130. trap sighandler $CHKPNT_SIGNAL
  131. # wait indispensable pour maintien des communucations
  132. # (signaux) entre ce script et le PROG
  133. while kill -0 "$PROGPID" 2>/dev/null; do
  134. wait $PROGPID
  135. done
  136. # important : le code 99 doit être retourné pour que l'option
  137. # idempotent ( relance auto.) soit effective
  138. [ -n "$SCRIPT_CHECKPOINTED" ] && exit 99
  139. #---------------------------------------------------------
  140. # fin du programme: postraitement
  141. #---------------------------------------------------------
  142. # DWTFYW!
  143. echo "---post treatement---"
  144. # suppression des ckpt (ménage)
  145. echo "fin effective du programme, suppression des checkpoints"
  146. rm -f ckpt_*.dmtcp dmtcp_restart_script*
  147. # a supprimer?
  148. mv hostname.txt last_hostname.txt
  149. cd ..
  150. cp -rp $RUN_DIR $OAR_WORKDIR
  151. cd ..
  152. rm -rf $SCRATCHDIR
  153. # écrasement de la dernière archive intermédiaire par l'originale
  154. mv $OAR_WORKDIR/$RUN_DIR.tgz.OAR $OAR_WORKDIR/$RUN_DIR.tgz
  155. exit $?