So starten Sie meinen systemd-Dienst neu, wenn seine Abhängigkeit aktualisiert wird

10

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.serviceund BindsTo=postgresql.servicedann 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.

Rennex
quelle
PartOf=klingt nach der richtigen Lösung. Hast du es mit Requires=entfernt versucht ?
Meuh
@meuh ich habe es jetzt mit Requires=entfernt versucht , das hat nicht geholfen. Ich denke, das Problem ist, dass PartOf=Links "Stoppen und Neustarten von Einheiten", aber Postgres wird während eines Upgrades nicht neu gestartet . Es wird gestoppt, aktualisiert und gestartet.
Rennex
Amüsanterweise systemctl restart postgresqlerinnert sich systemd dabei daran, die abhängigen Dienste erneut zu starten. Es scheint aus irgendeinem Grund passend zu sein, eine Kombination von stopund startanstelle von restart.
WGH

Antworten:

12

Ich fand die Antwort: Ich musste die letzte Zeile der Servicedatei ändern in:

WantedBy=postgresql.service

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:

# systemctl enable tabill.service
Failed to execute operation: Too many levels of symbolic links

Die Fehlermeldung war irreführend. Das Problem zu beheben war einfach:

# systemctl disable tabill.service
Removed symlink /etc/systemd/system/tabill.service.
Removed symlink /etc/systemd/system/multi-user.target.wants/tabill.service.

# systemctl enable tabill.service
Failed to execute operation: No such file or directory

# systemctl enable /srv/tabill/tabill.service
Created symlink from /etc/systemd/system/postgresql.service.wants/tabill.service to /srv/tabill/tabill.service.
Created symlink from /etc/systemd/system/tabill.service to /srv/tabill/tabill.service.

Jetzt stoppt und startet mein Dienst, wann immer Postgres es tut. Und natürlich startet Postgres, wenn das System startet.

Rennex
quelle