Перезапуск службы 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
Майкл Д.
1
Соответствующий: github.com/systemd/systemd/issues/4324
Михал Политовски

Ответы:

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 ядра)
Сулеман