Ich habe ein Programm geschrieben, das eine Postgres-Datenbank verwendet, und ich habe eine systemd-Servicedatei dafür geschrieben. Derzeit wird mein Dienst beim Booten einwandfrei gestartet und gestoppt, wenn Postgres für ein Upgrade (von apt upgrade
) gestoppt wird . Wenn das Upgrade jedoch abgeschlossen ist und Postgres erneut gestartet wird, wird mein Dienst nicht automatisch gestartet.
Kann ich eine Abhängigkeit definieren, um meinen Dienst automatisch neu zu starten?
Dies ist der Status meines Dienstes, nachdem er während des Postgres-Upgrades automatisch gestoppt wurde:
● tabill.service - My service
Loaded: loaded (/srv/tabill/tabill.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2017-07-04 00:29:24 EEST; 44min ago
Main PID: 1048 (code=killed, signal=TERM)
Beachten Sie, dass ich den Dienst problemlos manuell neu starten kann.
Hier ist meine Servicedatei:
[Unit]
Description=My service
Wants=nginx.service
Requires=postgresql.service
After=postgresql.service
[Service]
Type=simple
ExecStart=/srv/tabill/app/serve
Restart=always
TimeoutSec=60
[Install]
WantedBy=multi-user.target
Ich habe versucht , Postgres hinzuzufügen PartOf=postgresql.service
und BindsTo=postgresql.service
dann manuell zu stoppen und zu starten, aber beides hat nicht geholfen.
Natürlich könnte ich das entfernen Requires
, aber beide Dienste zusammen zu stoppen ist vorzuziehen, wenn nur beide wieder starten würden.
quelle
PartOf=
klingt nach der richtigen Lösung. Hast du es mitRequires=
entfernt versucht ?Requires=
entfernt versucht , das hat nicht geholfen. Ich denke, das Problem ist, dassPartOf=
Links "Stoppen und Neustarten von Einheiten", aber Postgres wird während eines Upgrades nicht neu gestartet . Es wird gestoppt, aktualisiert und gestartet.systemctl restart postgresql
erinnert sich systemd dabei daran, die abhängigen Dienste erneut zu starten. Es scheint aus irgendeinem Grund passend zu sein, eine Kombination vonstop
undstart
anstelle vonrestart
.Antworten:
Ich fand die Antwort: Ich musste die letzte Zeile der Servicedatei ändern in:
Auf diese Weise wird bei jedem Start von Postgres auch mein Dienst gestartet. Wenn mein Dienst jedoch fehlschlägt, wird Postgres dadurch nicht gestoppt.
Die Anweisungen in diesem
[Install]
Abschnitt betreffen nur das Aktivieren und Deaktivieren von Einheiten. Aber es war nicht so einfach, als mein Dienst bereits aktiviert war:Die Fehlermeldung war irreführend. Das Problem zu beheben war einfach:
Jetzt stoppt und startet mein Dienst, wann immer Postgres es tut. Und natürlich startet Postgres, wenn das System startet.
quelle