Автоматично перезавантажте сервіс Systemd щоразу, коли каталог змінюється (будь-який файл всередині нього)


25

Як перезапустити службу Systemd при зміні файлу. У мене є служба Java, яку я хочу перезавантажити, коли змінюється будь-який jar-файл.

Це моя установка:

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/

Я також спробував використовувати PathChangedі використовувати файл замість каталогу.

Коли я встановив службу, я виконав: sudo systemctl daemon-reloadі sudo systemctl enable srv

Спасибі!


2
Не перевірено, так що не відповідь, але з документації видно, що pathблоки корисні лише для активації (запуску) інших блоків. Тут ви, мабуть, могли б створити за srv-restart.pathдопомогою PathChanged=/opt/srv/lib/та за srv-restart.serviceдопомогою ExecStart=systemctl restart srv.service.
Michał Politowski

Здається, що якщо ви назвали це так само, як службу (з .path), файл шляху посилається на ту саму службу: freedesktop.org/software/systemd/man/systemd.path.html однак ... я не знаю якщо він лише запускає послугу або навіть перезапускає її, якщо вона вже працює
заклинання

Як я розумію з документів, srv.pathможна виконати лише еквівалент systemclt start srv.service, тому для автоматичного перезавантаження вам знадобиться інша послуга, яка при запуску перезапускає вашу службу.
Michał Politowski

Ви повинні почати її systemctl start srv.path- і , щоб він почав на черевикуsystemctl preset srv.path
Michael D.

Відповіді:


22

Коментар Міхала Політовського абсолютно правильний. Я використовую цей метод для автоматичного перезавантаження служб при розгортанні нових артефактів. Це дуже корисно.

Щоб було зрозуміло, вам потрібно:

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

6
Чи є гарантії щодо того, коли це запускається, якщо багато файлів швидко змінюються?
Річ Ремер

3
Важливо пам’ятати, що блок «.path» також повинен бути включений. У цьому випадку:systemctl enable srv-watcher.path && systemctl start srv-watcher.path
Па Руолан Феррагут

1
Якщо служба перезапуску не має тієї ж назви, що й .path файл, просто додайте Unit=nameofmyrestart.serviceдо [Path]розділу вашого .pathфайлу. freedesktop.org/software/systemd/man/systemd.path.html#Unit=
DKebler

Відмінно працює в CentOS для перезавантаження Kestrel (ASP.NET ядра)
Сулеман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.