Перезапуск службы 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.
— Михал Политовски,

Похоже, что если вы назовете его так же, как сервис (с .path), файл пути ссылается на тот же сервис: freedesktop.org/software/systemd/man/systemd.path.html однако ... Я не знаю если он только запускает службу или даже перезапускает ее, если она уже запущена
— глушение

Как я понял из документации, srv.pathможно сделать только эквивалент systemclt start srv.service, поэтому для автоматизации перезапусков вам понадобится другой сервис, который при запуске перезапускает ваш сервис.
— Михал Политовски,

Вы должны начать это systemctl start srv.path- и чтобы это началось при загрузкеsystemctl preset srv.path
— Майкл Д.

Ответы:


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.