Systemd Service nach einem bestimmten Service starten? [geschlossen]

83

Ich habe eine allgemeine Frage. Wie startet man eine systemd-Einheit, *.servicenachdem eine bestimmte *.serviceerfolgreich gestartet wurde?

Eine spezifischere Frage ist, wie fange ich website.serviceerst an, nachdem ich mongodb.servicebegonnen habe? Mit anderen Worten website.servicesollte davon abhängen mongodb.service.

jww
quelle
1
Diese Frage gehört zu ServerFault, nein?
Rémi
1
@ Rémi es ist okay auf beiden Seiten! :)
Anonymer Pinguin
2
@AnonymousPenguin Nein, es dauerte nur 3,5 Jahre, bis Sie geantwortet haben. Es ist keine themenbezogene Frage für SO. Es geht nicht um Programmierung. SF oder besser Unix / Linux.SE wäre weitaus geeigneter.
underscore_d
Stack Overflow ist eine Site für Programmier- und Entwicklungsfragen. Diese Frage scheint nicht zum Thema zu gehören, da es nicht um Programmierung oder Entwicklung geht. Weitere Informationen zu den Themen finden Sie hier in der Hilfe. Vielleicht ist Super User oder Unix & Linux Stack Exchange ein besserer Ort, um zu fragen.
JWW

Antworten:

115

In der .service-Datei im Abschnitt [Einheit]:

[Unit]
Description=My Website
After=syslog.target network.target mongodb.service

Der wichtige Teil ist der mongodb.service

Die Manpage beschreibt es jedoch aufgrund der Formatierung auf den ersten Blick nicht so klar

systemd.unit - gut formatiert

systemd.unit - nicht so gut formatiert

LW001
quelle
1
Unser Mongod-Service startet eine sehr große Datenbank. Der nachfolgende Dienst wird nicht korrekt gestartet, da Mongo nach dem Start anscheinend mehr Zeit zum Laden der Datenbank benötigt. Unser zweiter Dienst startet, schlägt jedoch fehl, da Mongo erfolgreich gestartet, die Datenbank jedoch nicht geladen wurde. Vielleicht könnte eine Verzögerung helfen ...
Wayofthefuture
Ist es möglich, dass der systemd-Dienst die folgenden Szenarien verarbeitet? Berücksichtigen Sie mehrere Dienste A, B, C, D. Wenn A existiert, möchte ich, dass B, C, D erst nach A beginnen. Andernfalls, wenn A nicht existiert, kann B, C, D in beliebiger Reihenfolge beginnen. Bitte helfen Sie
Achilles
@achilles Können Sie einen gefälschten Dienst A auf den Systemen erstellen, auf denen A nicht benötigt wird? Auf diese Weise können die Abhängigkeiten von B, C, D einfach gehalten werden.
Walter A
49

After=Die Abhängigkeit ist nur dann wirksam, wenn der Dienst einschließlich After=und der Dienst von After=als Teil Ihres Startvorgangs gestartet werden sollen.

Ex:

a.service
[Unit]
After=b.service

Auf diese Weise, wenn beide a.serviceund b.servicewerden aktiviert , dann systemd wird Auftrag b.servicenach a.service.

Wenn ich nicht Missverständnis, was Sie fragen, wie zu starten , b.servicewenn a.servicestartet , obwohl b.servicenicht aktiviert ist .

Die Richtlinie hierfür ist Wants=oder Requires=unter [Unit].

website.service
[Unit]
Wants=mongodb.service
After=mongodb.service

Der Unterschied zwischen Wants=und Requires=besteht darin, dass Requires=ein Fehler beim Starten dazu b.serviceführt, dass der Start von a.servicefehlschlägt, während mit Wants=, a.serviceselbst wenn er b.servicefehlschlägt. Dies wird auf der Manpage von.unit ausführlich erläutert .

Umut
quelle
8
Ich glaube, die Wahrheit ist das genaue Gegenteil dieser Antwort. After=website.servicebedeutet "mein Gerät nach website.service ausführen!". Dies wird in den Dokumenten erklärt: "After = stellt sicher, dass die konfigurierte Einheit nach dem Start der aufgelisteten Einheit gestartet wird" . Ich gehe davon aus, dass "aufgelistete Einheiten" Einheiten auf der rechten Seite von "After =" sind.
Sindarus
"Auf diese Weise bestellt systemd, wenn sowohl a.service als auch b.service aktiviert sind, b.service nach a.service." Meinen Sie nicht umgekehrt? swap(a, b)
Mateen Ulhaq