Systemd: Autostart-Dienst nach Mongodb

1154
Vladimir Gamalyan

ubuntu16.04.1, systemd

Eine Anwendung hängt von Mongodb ab. Die Anwendung und mongodb starten beim Booten als Dienste. app.serviceenthält nächste Zeile:

After=network.target mongod.service 

Leider scheitert die Anwendung (mit Verbindung zum Datenbankfehler), schätze ich, weil der mongodb einige Zeit benötigt, um gestartet zu werden und Verbindungen herzustellen (wenn ich die App später starte, ist alles in Ordnung).

Es sieht so aus, als würde Type=notify(in [Service]Abschnitt von mongod.service) das Problem lösen, wenn mongodb eine entsprechende Benachrichtigung an systemd sendet. Ich habe aber keine Dokumentation darüber gefunden.

Die Aufgabe besteht darin, die Anwendung automatisch zu starten, nachdem mongodb für eingehende Verbindungen bereit ist.

2

2 Antworten auf die Frage

2
Alex Batbold

Ich hatte ein ähnliches Problem ... Ich wollte Mongo-Connector starten, sobald MongoDB bereit ist, eine Verbindung zu akzeptieren.

Ich habe den Fix nach dem Googeln gefunden. Das Update bestand darin, die folgende ExecStartPost-Zeile nach der ExecStart-Zeile in der Mongodb-Unit-Datei hinzuzufügen.

ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf ExecStartPost=/bin/sh -c 'while ! /usr/bin/mongo --eval "db.version()" > /dev/null 2>&1; do sleep 0.1; done' 

Dies wurde auf meinem Ubuntu 16.04 Server erfolgreich getestet.

1
WilbaltSlayerOfGargoyles

Zum Nachschlagen habe ich folgende Lösung gefunden: https://gist.github.com/jwilm/5842956#gistcomment-2706797 Auf diese Weise blockiert mongodb, bis die Datenbank erreichbar ist, bevor systemd den nächsten Dienst startet. Und es ist kein Schlaf.

Wenn Sie über mongodb-Dienste verfügen, ist die Konfiguration etwas schwieriger, da der standardmäßige mongodb-Dienst zurückgegeben wird, bevor die Datenbank online ist. Dies kann dazu führen, dass schnelle Anwendungen versuchen, eine Verbindung zur Datenbank herzustellen. Um dies zu verhindern, fügen Sie Folgendes zu /etc/mongod.conf hinzu:

processManagement: fork: true 

Als Nächstes erstellen Sie /etc/systemd/system/mongod.service.d/mongod.conf (wodurch die vorhandene /lib/systemd/system/mongod.service erweitert wird) mit folgendem Inhalt:

[Service] Type=oneshot RemainAfterExit=yes 

Dies führt dazu, dass sudo systemctl start mongod den Server in einem verzweigten Prozess startet und erst dann zurückkehrt, wenn die Datenbank betriebsbereit ist und Verbindungen hergestellt werden können. Auf diese Weise werden abhängige Dienste erst aufgerufen, nachdem die Datenbank live ist.

Willkommen bei Super User! Können Sie hier die relevanten Schritte aus der Lösung angeben? :) bertieb vor 6 Jahren 1
@bertieb Ich habe den Inhalt des Links als blockquote hinzugefügt: thumbsup: WilbaltSlayerOfGargoyles vor 6 Jahren 0