Zrestartuj usługę Systemd automatycznie po każdej zmianie katalogu (dowolnego pliku w nim zawartego)

25

Jak zrestartować usługę Systemd po zmianie pliku. Mam usługę Java, którą chcę ponownie załadować, gdy zmieni się jakikolwiek plik jar.

Oto moja konfiguracja:

srv.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/

Próbowałem także użyć PathChangedpliku zamiast katalogu.

Po zainstalowaniu usługi wykonałem: sudo systemctl daemon-reloadi sudo systemctl enable srv

Dzięki!

zagłuszanie
źródło
2
Nie przetestowano, więc nie odpowiedź, ale z dokumentacji wydaje się, że pathjednostki są użyteczne tylko do aktywacji (uruchamiania) innych jednostek. Tutaj można prawdopodobnie tworzyć srv-restart.pathsię PathChanged=/opt/srv/lib/i srv-restart.servicez ExecStart=systemctl restart srv.service.
Michał Politowski
Wygląda na to, że jeśli nazwiesz go tak samo jak usługa (z .path), plik ścieżki odnosi się do tej samej usługi: freedesktop.org/software/systemd/man/systemd.path.html jednak ... Nie wiem jeśli tylko uruchomi usługę lub nawet uruchomi ją ponownie, jeśli jest już uruchomiona
blokuje
Jak rozumiem to z dokumentów, srv.pathmogę zrobić tylko odpowiednik systemclt start srv.service, więc do automatyzacji restartów będziesz potrzebować innej usługi, która po uruchomieniu ponownie uruchomi twoją usługę.
Michał Politowski
Musisz go uruchomić systemctl start srv.path- i uruchomić przy starciesystemctl preset srv.path
Michael D.
1
Ważne: github.com/systemd/systemd/issues/4324
Michał Politowski

Odpowiedzi:

22

Komentarz Michała Politowskiego jest dokładnie poprawny. Używam tej metody do automatycznego restartowania usług po wdrożeniu nowych artefaktów. To bardzo pomocne.

Żeby było jasne, potrzebujesz:

srv.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
Jan
źródło
6
Czy są jakieś gwarancje, kiedy zostanie to uruchomione, jeśli wiele plików zmienia się w szybkim tempie?
Rich Remer
3
Należy pamiętać, że należy również włączyć jednostkę «.path». W tym przypadku:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Pau Ruŀlan Ferragut
1
Jeśli usługa restartu nie ma takiej samej nazwy jak .path plik, po prostu dodaj Unit=nameofmyrestart.servicedo [Path]sekcji .pathpliku. freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler
Działa dobrze w CentOS przy ponownym uruchomieniu Kestrel (ASP.NET Core)
Suleman