Next: , Previous: , Up: Servicios   [Contents][Index]


12.9.2 Ejecución de tareas programadas

El módulo (gnu services mcron) proporciona una interfaz a GNU mcron, un daemon para ejecutar trabajos planificados de antemano (see GNU mcron). GNU mcron es similar al daemon tradicional de Unix cron; la principal diferencia es que está implementado en Scheme Guile, que proporciona mucha flexibilidad cuando se especifica la planificación de trabajos y sus acciones.

El siguiente ejemplo define un sistema operativo que ejecuta las órdenes updatedb (see Invoking updatedb in Finding Files) y guix gc (see Invocación de guix gc) de manera diaria, así como la orden mkid como una usuaria sin privilegios (see mkid invocation in ID Database Utilitites). Usa expresiones-g para introducir definiciones de trabajos que serán proporcionados a mcron (see Expresiones-G).

(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 ()
           (system* (string-append #$findutils "/bin/updatedb")
                    "--prunepaths=/tmp /var/tmp /gnu/store"))
         "updatedb"))

(define trabajo-recolector-basura
  ;; Recolecta basura 5 minutos después de media noche,
  ;; todos los días. La acción del trabajo es una orden
  ;; del shell.
  #~(job "5 0 * * *"            ;sintaxis de Vixie cron
         "guix gc -F 1G"))

(define trabajo-idutils
  ;; Actualiza el índice de la base de datos como "carlos" a las
  ;; 12:15 y a las 19:15.  Esto se ejecuta desde su directorio.
  #~(job '(next-minute-from (next-hour '(12 19)) '(15))
         (string-append #$idutils "/bin/mkid src")
         #:user "carlos"))

(operating-system
  ;; …

  ;; %BASE-SERVICES already includes an instance of
  ;; 'mcron-service-type', which we extend with additional
  ;; jobs using 'simple-service'.
  (services (cons (simple-service 'my-cron-jobs
                                   mcron-service-type
                                   (list garbage-collector-job
                                         updatedb-job
                                         idutils-job))
                  %base-services)))

Tip: When providing the action of a job specification as a procedure, you should provide an explicit name for the job via the optional 3rd argument as done in the updatedb-job example above. Otherwise, the job would appear as “Lambda function” in the output of herd schedule mcron, which is not nearly descriptive enough!

Tip: Avoid calling the Guile procedures execl, execle or execlp inside a job specification, else mcron won’t be able to output the completion status of the job.

Para trabajos más complejos definidos en Scheme donde necesita control en el ámbito global, por ejemplo para introducir una forma use-modules, puede mover su código a un programa separado usando el procedimiento program-file del módulo (guix gexp) (see Expresiones-G). El siguiente ejemplo ilustra este caso.

(define %tarea-alerta-bateria
  ;; Pita cuando la carga de la batería es inferior a %CARGA-MIN
  #~(job
     '(next-minute (range 0 60 1))
     #$(program-file
        "alerta-batería.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 %carga-min 20)

              (setenv "LC_ALL" "C")     ;Procesado de cadenas en inglés
              (and-let* ((entrada (open-pipe*
                                   OPEN_READ
                                   #$(file-append acpi "/bin/acpi")))
                         (salida (get-string-all entrada))
                         (m (string-match "Discharging, ([0-9]+)%" output))
                         (carga (string->number (match:substring m 1)))
                         ((< carga %carga-min)))
                (setenv "LC_ALL" "")     ;Mensaje de salida traducido
                (format #t "aviso: La carga de la batería es baja (~a%)~%"
                        carga)
                (invoke #$(file-append beep "/bin/beep") "-r5")))))))

See mcron job specifications in GNU mcron, para más información sobre las especificaciones de trabajos de mcron. A continuación se encuentra la referencia del servicio mcron.

En un sistema en ejecución puede usar la acción schedule del servicio para visualizar los siguientes trabajos mcron que se ejecutarán:

# herd schedule mcron

El ejemplo previo enumera las siguientes cinco tareas que se ejecutarán, pero también puede especificar el número de tareas a mostrar:

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

Este es el tipo del servicio mcron, cuyo valor es un objeto mcron-configuration.

This service type can be the target of a service extension that provides additional job specifications (see Composición de servicios). In other words, it is possible to define services that provide additional mcron jobs to run.

Tipo de datos: mcron-configuration

Available mcron-configuration fields are:

mcron (default: mcron) (type: file-like)

El paquete mcron usado.

jobs (default: ()) (type: list-of-gexps)

This is a list of gexps (see Expresiones-G), where each gexp corresponds to an mcron job specification (see mcron job specifications in GNU mcron).

log? (default: #t) (type: boolean)

Log messages to standard output.

log-format (default: "~1@*~a ~a: ~a~%") (type: string)

(ice-9 format) format string for log messages. The default value produces messages like "‘pid name: message"’ (see Invoking in GNU mcron). Each message is also prefixed by a timestamp by GNU Shepherd.


Next: , Previous: , Up: Servicios   [Contents][Index]