checkpoint-user1bis.oar 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #!/bin/bash
  2. #------------------- CHECKPOINT ---------------------------
  3. #
  4. # exemple de programme qui vient illustrer le cas décrit :
  5. # https://www-calculco.univ-littoral.fr/utilisation/lancer-un-calcul#h2-2-oardel
  6. # commande: oarsub -S ./checkpoint-user1bis.oar
  7. # cet exemple reprend l'exemple exemple 1 (checkpoint-user1.oar)
  8. # avec un programmer timer de 4mn
  9. # simplement c'est l'utilisateur qui déclencle le checkpoint
  10. # en supprimant son job avec la commande:
  11. # oardel -c -s SIGUSR2 XXXXX, où XXXX est le n° du job (JobID)
  12. #
  13. # Le checkpoint crée le fichier context_compteur.txt. Relancer le
  14. # script OAR ultérieurement entraîne un reprise du programme à
  15. # partir de ce contexte.
  16. #
  17. #-------------- paramètres OAR---------------------------
  18. #OAR -l cpu=1/core=1,walltime=00:5:00
  19. #OAR -n checkpoint-user1bis
  20. # Les fichiers de sortie sans paramètres $OAR_JOBID
  21. # (=> les jobs successifs écrivent dans les mêmes fichiers)
  22. #OAR -O OAR-ckpt-user1bis.out
  23. #OAR -E OAR-ckpt-user1bis.err
  24. #OAR -q default
  25. #IMPORTANT:
  26. # - par NFS: a priori pas de problème
  27. # - sur SCRATCH : il faut reprendre sur la même machine
  28. # par exemple :
  29. ##OAR -p network_address = 'orval08'
  30. ## besteffort est optionnel
  31. #OAR -t besteffort
  32. # signal envoyé par OAR (SIGUSR2)
  33. #OAR --signal 12
  34. #---------- la tâche à exécuter ------------------------
  35. # compilation ( peut être commenté si déjà compilé)
  36. gcc compteur4mn.c -o timer4mn
  37. # Note (compteur4mn.c): gère son propre checkpoint (SIGINT)
  38. #----------- pré-traitement -----------------------------
  39. # DWTFYW !
  40. echo "Debut du job ${OAR_JOB_ID}"
  41. #----------- lancement de la tâche ----------------------
  42. ./timer4mn &
  43. #---------------------------------------------------------
  44. # gestion de signaux
  45. #---------------------------------------------------------
  46. # Warning: c'est le script OAR qui reçoit le signal 12!
  47. # => il faut le capter et le transmettre au PROG
  48. ####################################################
  49. # pid du programme = pid de la dernière commande (: ./timer10mn)
  50. PROGPID=$!
  51. echo "le PROG PID est : $PROGPID"
  52. # fonction de traitement du signal OAR
  53. sighandler() {
  54. echo "reception checkpoint OAR (signal12)"
  55. # demande de checkpoint (-c) au programme
  56. # SIGINT = 2 = "CRTL + C" (cf compteur10mn.c)
  57. kill -s 2 $PROGPID
  58. # IMPORTANT: pause (creation du fichier contexte)
  59. sleep 5
  60. [ -n "$PROGPID" ] && kill -9 $PROGPID
  61. SCRIPT_CHECKPOINTED="YES"
  62. echo "checkpoint : $SCRIPT_CHECKPOINTED"
  63. }
  64. # signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici
  65. # à 12 par le paramètre --signal 12 (cf. param OAR au début)
  66. CHKPNT_SIGNAL=12
  67. # valeur de sortie en cas de checlpoint :
  68. # on laisse la valeur 99 nécessaire à l'option "--idempotent"
  69. # (restart automatique)
  70. # Dans le cas manuel, cette valeur peut être autre, l'important
  71. # est d'en fixer une pour sortir du programme sans aller à la fin
  72. # du script OAR (sinon le contexte est suppimé . cf les dernières lignes)
  73. EXIT_UNFINISHED=99
  74. # si le script OAR reçoit le SIGUSR2 (signal 12), checkpoint!
  75. # indique au script OAR de capter le signal 12
  76. trap sighandler $CHKPNT_SIGNAL
  77. # wait indispensable pour maintien des communucations
  78. # (signaux) entre ce script et le PROG
  79. while kill -0 "$PROGPID" 2>/dev/null; do
  80. wait $PROGPID
  81. done
  82. # sortir ici ( sinon suppression du fichier context_compteur.txt )
  83. [ -n "$SCRIPT_CHECKPOINTED" ] && exit $EXIT_UNFINISHED
  84. #---------------------------------------------------------
  85. # fin du programme: postraitement
  86. #---------------------------------------------------------
  87. # DWTFYW!
  88. echo " ---post treatement---"
  89. echo " ...suppression du fichier temporaire context_compteur.txt"
  90. rm -f context_compteur.txt
  91. echo " c'est FINI ! "
  92. exit $?