Nächste: Komplizierte Konfigurationen, Vorige: Service-Referenz, Nach oben: Dienste definieren [Inhalt][Index]
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:
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.
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 Defining Services 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.
respawn-limit
(Vorgabe: #f
)Hiermit kann beschränkt werden, wie viele Male und wie schnell ein Dienst durch Shepherd neu gestartet werden soll, ehe er deaktiviert wird. Siehe Defining Services in The GNU Shepherd Manual für mehr Informationen.
respawn-delay
(Vorgabe: #f
)Wenn dies wahr ist, ist es die Verzögerung in Sekunden, ehe ein Dienst, der nicht starten konnte, neu gestartet wird.
start
(Vorgabe: #~(const #t)
)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…]
free-form
(Vorgabe: #f
)When set, this field replaces the start
, stop
, and
actions
fields. It is meant to be used when the service definition
comes from some other source, typically the service collection provided by
the Shepherd proper (siehe Service Collection in The GNU Shepherd
Manual).
For example, the snippet below defines a service for the Shepherd’s built-in REPL (read-eval-print loop) service (siehe REPL Service in The GNU Shepherd Manual):
(shepherd-service
(provision '(repl))
(modules '((shepherd service repl)))
(free-form #~(repl-service)))
In this case, the service object is returned by the repl-service
procedure of the Shepherd, so all the free-form
G-expression does is
call that procedure. Note that the provision
field must be
consistent with the actual service provision.
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).
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 Defining Services in The GNU Shepherd Manual für mehr Informationen zu Aktionen.
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!
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.
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))))))
Dieser Dienst repräsentiert PID 1.
Nächste: Komplizierte Konfigurationen, Vorige: Service-Referenz, Nach oben: Dienste definieren [Inhalt][Index]