Suivant: , Précédent: , Monter: Services   [Table des matières][Index]


12.9.2 Exécution de tâches planifiées

Le module (gnu services mcron) fournit une interface pour GNU mcron, un démon qui lance des tâches planifiées (voir GNU mcron). GNU mcron est similaire au démon Unix traditionnel cron ; la principale différence est qu’il est implémenté en Guile Scheme, qui fournit beaucoup de flexibilité lors de la spécification de la planification des tâches et de leurs actions.

L’exemple en dessous définit un système d’exploitation qui lance les commandes updatebd (voir Invoking updatedb dans Finding Files) et guix gc (voir Invoquer guix gc) tous les jours, ainsi que la commande mkid en tant qu’utilisateur non privilégié (voir mkid invocation dans ID Database Utilities). Il utilise des gexps pour introduire des définitions de tâches qui sont passées à mcron (voir G-Expressions).

(use-modules (guix) (gnu) (gnu services mcron))
(use-package-modules base idutils)

(define updatedb-job
  ;; Run 'updatedb' at 3AM every day.  Here we write the
  ;; job's action as a Scheme procedure.
  #~(job '(next-hour '(3))
         (lambda ()
           (execl (string-append #$findutils "/bin/updatedb")
                  "updatedb"
                  "--prunepaths=/tmp /var/tmp /gnu/store"))
         "updatedb"))

(define garbage-collector-job
  ;; Lance le ramasse-miettes tous les jours à minuit cinq.
  ;; L'action de la tâche est une commande shell.
  #~(job "5 0 * * *"            ;Vixie cron syntax
         "guix gc -F 1G"))

(define idutils-job
  ;; Met à jour la base de données d'index en tant que « charlie » à 12h15
  ;; et 19h15.  La commande est lancée depuis le répertoire personnel de l'utilisateur.
  #~(job '(next-minute-from (next-hour '(12 19)) '(15))
         (string-append #$idutils "/bin/mkid src")
         #:user "charlie"))

(operating-system
  ;; …

  ;; %BASE-SERVICES inclus déjà une instance de
  ;; « mcron-service-type », que nous étendons avec un
  ;; travail supplémentaire avec « simple-service ».
  (services (cons (simple-service 'my-cron-jobs
                                   mcron-service-type
                                   (list garbage-collector-job
                                         updatedb-job
                                         idutils-job))
                  %base-services)))

Astuce : Lorsque vous fournissez l’action d’une spécification de tâche avec une procédure, vous devriez donner un nom explicite à la tâche via le troisième argument facultatif comme dans l’exemple updatedb-job ci-dessus. Sinon, la tâche apparaitra comme « Lambda function » dans la sortie de herd schedule mcron, ce qui n’est pas très descriptif !

Pour les tâches plus complexes définies dans Scheme où vous devez contrôler le haut niveau, par exemple pour introduire un formulaire use-modules, vous pouvez déplacer votre code vers un programme séparé en utilisant la procédure program-file du module (guix gexp) (voir G-Expressions). L’exemple ci-dessous illustre cette possibilité.

(define %battery-alert-job
  ;; Beep when the battery percentage falls below %MIN-LEVEL.
  #~(job
     '(next-minute (range 0 60 1))
     #$(program-file
        "battery-alert.scm"
        (with-imported-modules (source-module-closure
                                '((guix build utils)))
          #~(begin
              (use-modules (guix build utils)
                           (ice-9 popen)
                           (ice-9 regex)
                           (ice-9 textual-ports)
                           (srfi srfi-2))

              (define %min-level 20)

              (setenv "LC_ALL" "C")     ; assure que la sortie est en anglais
              (and-let* ((input-pipe (open-pipe*
                                      OPEN_READ
                                      #$(file-append acpi "/bin/acpi")))
                         (output (get-string-all input-pipe))
                         (m (string-match "Discharging, ([0-9]+)%" output))
                         (level (string->number (match:substring m 1)))
                         ((< level %min-level)))
                (format #t "warning: Battery level is low (~a%)~%" level)
                (invoke #$(file-append beep "/bin/beep") "-r5")))))))

Voir mcron job specifications dans GNU mcron, pour plus d’informations sur les spécifications des tâche de mcron. Ci-dessous est la référence du service mcron.

Sur un système lancé, vous pouvez utiliser l’action schedule du service pour visualiser les travaux mcron qui seront exécutés ensuite :

# herd schedule mcron

Cet exemple ci-dessus montre les cinq tâches qui seront exécutés, mais vous pouvez spécifier le nombre de tâches à afficher :

# herd schedule mcron 10
Variable Scheme :mcron-service-type

C’est le type du service mcron, dont la valeur est un objet mcron-configuration.

Ce type de service peut être la cible d’une extension de service qui fournit des spécifications de tâches supplémentaires (voir Composition de services). En d’autres termes, il est possible de définir des services qui fournissent des tâches mcron à lancer.

Type de données :mcron-configuration

Les champs de mcron-configuration disponibles sont :

mcron (par défaut : mcron) (type : simili-fichier)

Le paquet mcron à utiliser.

jobs (par défaut : ()) (type : liste-de-gexps)

C’est la liste des gexps (voir G-Expressions), où chaque gexp correspond à une spécification de tâche de mcron (voir mcron job specifications dans GNU mcron).

log? (par défaut : #t) (type : booléen)

Journalise les messages sur la sortie standard.

log-format (par défaut : "~1@*~a ~a: ~a~%") (type : chaine)

Chaine de format (ice-9 format) pour les message de journaux. La valeur par défaut produit des messages de type « ‘pid name: message’ » (voir Invoking dans GNU mcron). Chaque message est aussi préfixé par un horodatage par le GNU Shepherd.


Suivant: Rotation des journaux, Précédent: Services de base, Monter: Services   [Table des matières][Index]