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


12.18.4 Shepherd-Dienste

Das Modul (gnu services shepherd) gibt eine Methode an, mit der Dienste definiert werden können, die von GNU Shepherd verwaltet werden, was das Initialisierungssystem (das „init“-System) ist – es ist der erste Prozess, der gestartet wird, wenn das System gebootet wird, auch bekannt als PID 1 (siehe Introduction in The GNU Shepherd Manual).

Dienste unter dem Shepherd können voneinander abhängen. Zum Beispiel kann es sein, dass der SSH-Daemon erst gestartet werden darf, nachdem der Syslog-Daemon gestartet wurde, welcher wiederum erst gestartet werden kann, sobald alle Dateisysteme eingebunden wurden. Das einfache Betriebssystem, dessen Definition wir zuvor gesehen haben (siehe Das Konfigurationssystem nutzen), ergibt folgenden Dienstgraphen:

Typischer Shepherd-Dienstgraph

Sie können so einen Graphen tatsächlich für jedes Betriebssystem erzeugen lassen, indem Sie den Befehl guix system shepherd-graph benutzen (siehe guix system shepherd-graph).

Der %shepherd-root-service ist ein Dienstobjekt, das diesen Prozess mit PID 1 repräsentiert. Der Dienst hat den Typ shepherd-root-service-type. Sie können ihn erweitern, indem Sie eine Liste von <shepherd-service>-Objekten an ihn übergeben.

Datentyp: shepherd-service

Der Datentyp, der einen von Shepherd verwalteten Dienst repräsentiert.

provision

Diese Liste von Symbolen gibt an, was vom Dienst angeboten wird.

Das bedeutet, es sind die Namen, die an herd start, herd status und ähnliche Befehle übergeben werden können (siehe Invoking herd in The GNU Shepherd Manual). Siehe den provides-Slot in The GNU Shepherd Manual für Details.

requirement (Vorgabe: '())

Eine Liste von Symbolen, die angeben, von welchen anderen Shepherd-Diensten dieser hier abhängt.

one-shot? (Vorgabe: #f)

Gibt an, ob dieser Dienst nur einmal ausgeführt wird („one-shot“). Einmalig ausgeführte Dienste werden gestoppt, sobald ihre start-Aktion abgeschlossen wurde. Siehe Slots of services in The GNU Shepherd Manual für weitere Informationen.

respawn? (Vorgabe: #t)

Ob der Dienst neu gestartet werden soll, nachdem er gestoppt wurde, zum Beispiel wenn der ihm zu Grunde liegende Prozess terminiert wird.

start
stop (Vorgabe: #~(const #f))

Die Felder start und stop beziehen sich auf Shepherds Funktionen zum Starten und Stoppen von Prozessen (siehe Service De- and Constructors in The GNU Shepherd Manual). Sie enthalten G-Ausdrücke, die in eine Shepherd-Konfigurationdatei umgeschrieben werden (siehe G-Ausdrücke).

actions (Vorgabe: '())

Dies ist eine Liste von shepherd-action-Objekten (siehe unten), die vom Dienst zusätzlich unterstützte Aktionen neben den Standardaktionen start und stop angeben. Hier aufgeführte Aktionen werden als herd-Unterbefehle verfügbar gemacht:

herd Aktion Dienst [Argumente…]
auto-start? (Vorgabe: #t)

Ob dieser Dienst automatisch durch Shepherd gestartet werden soll. Wenn es auf #f steht, muss der Dienst manuell über herd start gestartet werden.

documentation

Eine Zeichenkette zur Dokumentation, die angezeigt wird, wenn man dies ausführt:

herd doc Dienstname

wobei der Dienstname eines der Symbole aus der provision-Liste sein muss (siehe Invoking herd in The GNU Shepherd Manual).

modules (Vorgabe: %default-modules)

Dies ist die Liste der Module, die in den Sichtbarkeitsbereich geladen sein müssen, wenn start und stop ausgewertet werden.

Im folgenden Beispiel wird ein Shepherd-Dienst definiert, der syslogd, den Systemprotokollier-Daemon aus den GNU Networking Utilities, startet (siehe syslogd in GNU Inetutils):

(let ((config (plain-file "syslogd.conf" "…")))
  (shepherd-service
    (documentation "Den Syslog-Daemon (syslogd) ausführen.")
    (provision '(syslogd))
    (requirement '(user-processes))
    (start #~(make-forkexec-constructor
               (list #$(file-append inetutils "/libexec/syslogd")
                     "--rcfile" #$config)
               #:pid-file "/var/run/syslog.pid"))
    (stop #~(make-kill-destructor))))

Die Kernelemente in diesem Beispiel sind die Felder start und stop: Es sind Code-Schnipsel, die erst später ausgewertet werden; wir sagen, sie sind staged. Sie benutzen die von Shepherd bereitgestellte Prozedur make-forkexec-constructor und ihr duales Gegenstück, make-kill-destructor (siehe das Service De- and Constructors in Handbuch von GNU Shepherd). Durch das start-Feld wird shepherd das syslogd-Programm mit den angegebenen Befehlszeilenoptionen starten; beachten Sie, dass wir config nach --rcfile angeben; dabei handelt es sich um eine vorher im Code deklarierte Konfigurationsdatei (deren Inhalt wir hier nicht erklären). Entsprechend wird mit dem Feld stop ausgesagt, wie dieser Dienst gestoppt werden kann; in diesem Fall wird er über den Systemaufruf kill gestoppt, dem die PID des Prozesses übergeben wird. Code-Staging wird über G-Ausdrücke umgesetzt: Mit #~ beginnt der später ausgeführte „staged Code“, und #$ beendet dies und der Code darin wird wirtsseitig hier und jetzt ausgewertet (siehe G-Ausdrücke).

Datentyp: shepherd-action

Dieser Datentyp definiert zusätzliche Aktionen, die ein Shepherd-Dienst implementiert (siehe oben).

name

Die Aktion bezeichnendes Symbol.

documentation

Diese Zeichenkette ist die Dokumentation für die Aktion. Sie können sie sehen, wenn Sie dies ausführen:

herd doc Dienst action Aktion
procedure

Dies sollte ein G-Ausdruck sein, der zu einer mindestens ein Argument nehmenden Prozedur ausgewertet wird. Das Argument ist der „running“-Wert des Dienstes (siehe Slots of services in The GNU Shepherd Manual).

Das folgende Beispiel definiert eine Aktion namens sag-hallo, die den Benutzer freundlich begrüßt:

(shepherd-action
  (name 'sag-hallo)
  (documentation "Sag Hallo!")
  (procedure #~(lambda (running . args)
                 (format #t "Hallo, Freund! Argumente: ~s\n"
                         args)
                 #t)))

Wenn wir annehmen, dass wir die Aktion zum Dienst beispiel hinzufügen, können Sie Folgendes ausführen:

# herd sag-hallo beispiel
Hallo, Freund! Argumente: ()
# herd sag-hallo beispiel a b c
Hallo, Freund! Argumente: ("a" "b" "c")

Wie Sie sehen können, ist das eine sehr ausgeklügelte Art, Hallo zu sagen. Siehe Service Convenience in The GNU Shepherd Manual für mehr Informationen zu Aktionen.

Scheme-Prozedur: shepherd-configuration-action

Liefert eine Aktion configuration, mit der Datei angezeigt wird. Dafür sollte der Name der Konfigurationsdatei des Dienstes übergeben werden.

Dienste mit dieser Aktion auszustatten, kann hilfreich sein. Zum Beispiel ist der Tor-Dienst für anonyme Netzwerkrouten (siehe tor-service-type) ungefähr so definiert:

(let ((torrc (plain-file "torrc" )))
  (shepherd-service
    (provision '(tor))
    (requirement '(user-processes loopback syslogd))

    (start #~(make-forkexec-constructor
              (list #$(file-append tor "/bin/tor") "-f" #$torrc)
              #:user "tor" #:group "tor"))
    (stop #~(make-kill-destructor))
    (actions (list (shepherd-configuration-action torrc)))
    (documentation "Run the Tor anonymous network overlay.")))

Über diese Aktion haben Administratoren die Möglichkeit, zu prüfen, wie die an tor übergebene Konfigurationsdatei aussieht, mit einem Shell-Befehl wie:

cat $(herd configuration tor)

So gelingt die Fehlersuche!

Scheme-Variable: shepherd-root-service-type

Der Diensttyp für den Shepherd-„Wurzeldienst“ – also für PID 1.

Dieser Diensttyp stellt das Ziel für Diensterweiterungen dar, die Shepherd-Dienste erzeugen sollen (siehe Diensttypen und Dienste für ein Beispiel). Jede Erweiterung muss eine Liste von <shepherd-service>-Objekten übergeben. Sein Wert muss eine shepherd-configuration sein, wie im Folgenden beschrieben.

Datentyp: shepherd-configuration

Dieser Datentyp repräsentiert die Konfiguration von Shepherd.

shepherd (Vorgabe: shepherd)

Das zu benutzende Shepherd-Paket.

services (Vorgabe: '())

Eine Liste zu startender Shepherd-Dienste als <shepherd-service>-Objekte. Wahrscheinlich sollten Sie stattdessen den Mechanismus zur Diensterweiterung benutzen (siehe Shepherd-Dienste).

Im folgenden Beispiel wird ein anderes Shepherd-Paket für das Betriebssystem festgelegt:

(operating-system
  ;; …
  (services (append (list openssh-service-type))
            ;; …
            %desktop-services)
  ;; …
  ;; Eigenes Shepherd-Paket benutzen.
  (essential-services
   (modify-services (operating-system-default-essential-services
                     this-operating-system)
     (shepherd-root-service-type config => (shepherd-configuration
                                            (inherit config)
                                            (shepherd my-shepherd))))))
Scheme-Variable: %shepherd-root-service

Dieser Dienst repräsentiert PID 1.


Nächste: Komplizierte Konfigurationen, Vorige: Service-Referenz, Nach oben: Dienste definieren   [Inhalt][Index]