Nächste: , Vorige: , Nach oben: Dienste   [Inhalt][Index]


12.9.2 Geplante Auftragsausführung

Das Modul (gnu services mcron) enthält eine Schnittstelle zu GNU mcron, einem Daemon, der gemäß einem vorher festgelegten Zeitplan Aufträge (sogenannte „Jobs“) ausführt (siehe GNU mcron). GNU mcron ist ähnlich zum traditionellen cron-Daemon aus Unix; der größte Unterschied ist, dass mcron in Guile Scheme implementiert ist, wodurch einem viel Flexibilität bei der Spezifikation von Aufträgen und ihren Aktionen offen steht.

Das folgende Beispiel definiert ein Betriebssystem, das täglich die Befehle updatedb (siehe Invoking updatedb in Finding Files) und guix gc (siehe guix gc aufrufen) ausführt sowie den Befehl mkid im Namen eines „unprivilegierten“ Nutzers ohne besondere Berechtigungen laufen lässt (siehe mkid invocation in ID Database Utilities). Zum Anlegen von Auftragsdefinitionen benutzt es G-Ausdrücke, die dann an mcron übergeben werden (siehe G-Ausdrücke).

(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
  ;; Jeden Tag 5 Minuten nach Mitternacht Müll sammeln gehen.
  ;; Die Aktion des Auftrags ist ein Shell-Befehl.
  #~(job "5 0 * * *"            ;Vixie-cron-Syntax
         "guix gc -F 1G"))

(define idutils-job
  ;; Die Index-Datenbank des Benutzers "charlie" um 12:15 Uhr und
  ;; 19:15 Uhr aktualisieren. Dies wird aus seinem Persönlichen
  ;; Ordner heraus ausgeführt.
  #~(job '(next-minute-from (next-hour '(12 19)) '(15))
         (string-append #$idutils "/bin/mkid src")
         #:user "charlie"))

(operating-system
  ;; …

  ;; In den %BASE-SERVICES kommt bereits eine Instanz des
  ;; 'mcron-service-type' vor. Wir erweitern sie um weitere
  ;; Aufträge mit einem 'simple-service'.
  (services (cons (simple-service 'my-cron-jobs
                                   mcron-service-type
                                   (list garbage-collector-job
                                         updatedb-job
                                         idutils-job))
                  %base-services)))

Tipp: Wenn Sie die Aktion einer Auftragsspezifikation als eine Prozedur angeben, sollten Sie ausdrücklich einen Namen für den Auftrag im dritten Argument angeben, wie oben im Beispiel zum updatedb-job gezeigt. Andernfalls wird für den Auftrag nur „Lambda function“ in der Ausgabe von herd schedule mcron angezeigt, was viel zu wenig Aussagekraft hat!

Wenn Sie einen komplexeren Auftrag mit Scheme-Code auf oberster Ebene festlegen möchten, um zum Beispiel eine use-modules-Form einzuführen, können Sie Ihren Code in ein separates Programm verschieben, indem Sie die Prozedur program-file aus dem Modul (guix gexp) benutzen (siehe G-Ausdrücke). Das folgende Beispiel veranschaulicht dies.

(define %batterie-alarm-auftrag
  ;; Piepsen, wenn die Akkuladung in Prozent unter %MIN-NIVEAU fällt.
  #~(job
     '(next-minute (range 0 60 1))
     #$(program-file
        "batterie-alarm.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-niveau 20)
              (setenv "LC_ALL" "C")     ;Ausgabe auf Englisch
              (and-let* ((input-pipe (open-pipe*
                                      OPEN_READ
                                      #$(file-append acpi "/bin/acpi")))
                         (ausgabe (get-string-all input-pipe))
                         (m (string-match "Discharging, ([0-9]+)%" ausgabe))
                         (niveau (string->number (match:substring m 1)))
                         ((< niveau %min-niveau)))
                (format #t "Warnung: Batterieladung nur noch (~a%)~%" niveau)
                (invoke #$(file-append beep "/bin/beep") "-r5")))))))

Siehe mcron-Auftragsspezifikationen in GNU mcron für weitere Informationen zu mcron-Auftragsspezifikationen. Nun folgt die Referenz des mcron-Dienstes.

Wenn das System läuft, können Sie mit der Aktion schedule des Dienstes visualisieren lassen, welche mcron-Aufträge als Nächstes ausgeführt werden:

# herd schedule mcron

Das vorangehende Beispiel listet die nächsten fünf Aufgaben auf, die ausgeführt werden, aber Sie können auch angeben, wie viele Aufgaben angezeigt werden sollen:

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

Dies ist der Diensttyp des mcron-Dienstes. Als Wert verwendet er ein mcron-configuration-Objekt.

Dieser Diensttyp kann als Ziel einer Diensterweiterung verwendet werden, die ihn mit zusätzlichen Auftragsspezifikationen versorgt (siehe Dienstkompositionen). Mit anderen Worten ist es möglich, Dienste zu definieren, die weitere mcron-Aufträge ausführen lassen.

Datentyp: mcron-configuration

Verfügbare mcron-configuration-Felder sind:

mcron (Vorgabe: mcron) (Typ: dateiartig)

Welches mcron-Paket benutzt werden soll.

jobs (Vorgabe: ()) (Typ: Liste-von-G-Ausdrücken)

Dies muss eine Liste von G-Ausdrücken sein (siehe G-Ausdrücke), die jeweils einer mcron-Auftragsspezifikation (der Spezifikation eines „Jobs“) entsprechen (siehe mcron-Auftragsspezifikationen in GNU mcron).

log? (Vorgabe: #t) (Typ: Boolescher-Ausdruck)

Lässt Protokolle auf die Standardausgabe schreiben.

log-format (Vorgabe: "~1@*~a ~a: ~a~%") (Typ: Zeichenkette)

Eine Formatzeichenkette gemäß (ice-9 format) für die Protokollnachrichten. Mit dem Vorgabewert werden Nachrichten in der Form "‘Prozesskennung Name: Nachricht"’ geschrieben (siehe Aufrufen von mcron in GNU mcron). Außerdem schreibt GNU Shepherd vor jeder Nachricht einen Zeitstempel.


Nächste: Log-Rotation, Vorige: Basisdienste, Nach oben: Dienste   [Inhalt][Index]