Starten Sie den Systemd-Dienst automatisch neu, wenn sich ein Verzeichnis ändert (alle darin enthaltenen Dateien).

24

Wie starte ich einen Systemd-Dienst neu, wenn sich eine Datei ändert? Ich habe einen Java-Dienst, den ich neu laden möchte, wenn sich eine JAR-Datei ändert.

Das ist mein Setup:

Service

[Unit]
Description=srv 0.1: Service's description
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/srv
ExecStart=/opt/srv/bin/srv
User=root
Group=root

[Install]
WantedBy=multi-user.target

srv.path

[Path]
PathModified=/opt/srv/lib/

Ich habe auch versucht, PathChangedeine Datei anstelle eines Verzeichnisses zu verwenden.

Bei der Installation des Dienstes habe ich ausgeführt: sudo systemctl daemon-reloadund sudo systemctl enable srv

Vielen Dank!

einklemmen
quelle
2
Nicht getestet, also keine Antwort, aber aus der Dokumentation geht hervor, dass pathEinheiten nur zum Aktivieren (Starten) anderer Einheiten nützlich sind. Hier könnte man wohl srv-restart.pathmit PathChanged=/opt/srv/lib/und srv-restart.servicemit erstellen ExecStart=systemctl restart srv.service.
Michał Politowski
Es scheint, dass, wenn Sie den gleichen Namen wie den Dienst (mit .path) verwenden, die Pfaddatei auf denselben Dienst verweist: freedesktop.org/software/systemd/man/systemd.path.html, aber ... ich weiß nicht wenn es nur einen Dienst startet oder ihn sogar neu startet, wenn er bereits läuft
Stau am
So wie ich es aus den Dokumenten verstehe, srv.pathkann es nur das Äquivalent von tun systemclt start srv.service, so dass Sie zum Automatisieren von Neustarts einen anderen Dienst benötigen, der beim Starten Ihren Dienst neu startet.
Michał Politowski
Sie müssen es starten systemctl start srv.path- und beim Booten starten lassensystemctl preset srv.path
Michael D.
1
Relevant: github.com/systemd/systemd/issues/4324
Michał Politowski

Antworten:

21

Michal Politowskis Kommentar ist genau richtig. Ich verwende diese Methode, um Dienste automatisch neu zu starten, wenn neue Artefakte bereitgestellt werden. Es ist sehr hilfreich.

Um klar zu sein, brauchen Sie:

Service

[Unit]
Description=srv 0.1: Service's description
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/srv
ExecStart=/opt/srv/bin/srv
User=root
Group=root

[Install]
WantedBy=multi-user.target

srv-watcher.service

[Unit]
Description=srv restarter
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart srv.service

[Install]
WantedBy=multi-user.target

srv-watcher.path

[Path]
PathModified=/opt/srv/lib

[Install]
WantedBy=multi-user.target
John
quelle
6
Gibt es Garantien, wann dies ausgelöst wird, wenn viele Dateien in schneller Folge geändert werden?
Rich Remer
3
Es ist wichtig zu beachten, dass die Einheit «.path» ebenfalls aktiviert werden muss. In diesem Fall:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut
1
Wenn Ihr Neustartdienst nicht denselben Namen wie die .path Datei hat, fügen Sie ihn einfach Unit=nameofmyrestart.servicedem [Path]Abschnitt Ihrer .pathDatei hinzu. freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler
Funktioniert gut in CentOS zum Neustarten von Kestrel (ASP.NET Core)
Suleman