checkpoint-user1.oar 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/bin/bash
  2. #------------------- CHECKPOINT ---------------------------
  3. #
  4. # exemple de programme "trop long" qui utilise la fonctionnalité
  5. # "checkpoint" d'OAR, suivi de reprise(s) automatique(s)
  6. # (fonctionnalité idempotent) ... jusqu' à la fin du programme
  7. # commande: oarsub -S ./checkpoint-user1.oar
  8. # Cet exemple est arrêté 1 fois ( 2 jobs consécutifs pour finir)
  9. #
  10. # IMPORTANT:
  11. # Ce script OAR capte bien le signal de checkpoint envoyé par
  12. # OAR, envoit un signal (à adapter éventuellement) au programme de
  13. # de l'utilisateur, MAIS c'est LE PROGRAMME de l'utilisateur qui
  14. # doit capter et interpréter ce signal ... afin de sauver le
  15. # "contexte" de son execution de sorte qu'au remédérrage
  16. # automatique ( - t idempotent ), il ne reprenne pas du début
  17. # ( sinon il y a une boucle infinie !)
  18. #
  19. # Le programme associé à ce script est un simple compteur
  20. # ( 1 incrémentation / secondes ) en C.
  21. # - son exécution (normal) dure 4 mn
  22. # - ce script OAR, pour l'exemple, ne prévoit que 3mn30 (trop court!)
  23. # - le script OAR reçoit (d'OAR) le signal checkpoint 12.
  24. # Il renvoit le signal 2 (SIGINT) au programme timer
  25. # - À réception de ce dernier (interruption) le timer sauve
  26. # aussitôt son contexte (le n° d'itération) dans un fichier local.
  27. # - timer10mn est arrêté mais est relancé par OAR
  28. #
  29. #-------------- paramètres OAR---------------------------
  30. #OAR -l cpu=1/core=1,walltime=00:3:30
  31. #OAR -n checkpoint-user1
  32. # Les fichiers de sortie sans paramètres $OAR_JOBID
  33. # (=> les jobs successifs écrivent dans les mêmes fichiers)
  34. #OAR -O OAR-ckpt-user1.out
  35. #OAR -E OAR-ckpt-user1.err
  36. #OAR -q default
  37. ## besteffort est optionnel
  38. #OAR -t besteffort
  39. ## idempotent ne l'est pas
  40. #OAR -t idempotent
  41. # checkpoint 60 s avant le walltime: pour un exemple
  42. # réel ( plusieurs heures, gros contexte, 600 (10mn))
  43. #OAR --checkpoint 60
  44. # signal envoyé par OAR (SIGUSR2)
  45. #OAR --signal 12
  46. #---------- la tâche à exécuter ------------------------
  47. # compilation ( peut être commenté si déjà compilé)
  48. gcc compteur4mn.c -o timer4mn
  49. # Note (compteur4mn.c): gère son propre checkpoint (SIGINT)
  50. #----------- pré-traitement -----------------------------
  51. # DWTFYW !
  52. echo "Debut du job ${OAR_JOB_ID}"
  53. #----------- lancement de la tâche ----------------------
  54. ./timer4mn &
  55. #---------------------------------------------------------
  56. # gestion de signaux
  57. #---------------------------------------------------------
  58. # Warning: c'est le script OAR qui reçoit le signal 12!
  59. # => il faut le capter et le transmettre au PROG
  60. ####################################################
  61. # pid du programme = pid de la dernière commande (: ./timer10mn)
  62. PROGPID=$!
  63. echo "le PROG PID est : $PROGPID"
  64. # fonction de traitement du signal OAR
  65. sighandler() {
  66. echo "reception checkpoint OAR (signal12)"
  67. # demande de checkpoint (-c) au programme
  68. # SIGINT = 2 = "CRTL + C" (cf compteur10mn.c)
  69. kill -s 2 $PROGPID
  70. # IMPORTANT : pause
  71. sleep 4
  72. [ -n "$PROGPID" ] && kill -9 $PROGPID
  73. SCRIPT_CHECKPOINTED="YES"
  74. echo "checkpoint : $SCRIPT_CHECKPOINTED"
  75. }
  76. # signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici
  77. # à 12 par le paramètre --signal 12 (cf. param OAR au début)
  78. CHKPNT_SIGNAL=12
  79. # valeur de sortie pour l'option "--idempotent"
  80. # (restart automatique) )
  81. EXIT_UNFINISHED=99
  82. # si le script OAR reçoit le SIGUSR2 (signal 12), checkpoint!
  83. # indique au script OAR de capter le signal 12
  84. trap sighandler $CHKPNT_SIGNAL
  85. # wait indispensable pour maintien des communucations
  86. # (signaux) entre ce script et le PROG
  87. while kill -0 "$PROGPID" 2>/dev/null; do
  88. wait $PROGPID
  89. done
  90. [ -n "$SCRIPT_CHECKPOINTED" ] && exit 99
  91. #---------------------------------------------------------
  92. # fin du programme: postraitement
  93. #---------------------------------------------------------
  94. # DWTFYW!
  95. echo " ---post treatement---"
  96. echo " ...suppression du fichier temporaire context_compteur.txt"
  97. rm -f context_compteur.txt
  98. echo " c'est FINI ! "
  99. # => idempotent devrait entraîner un redémarrage auto.
  100. exit $?