Автоматический перезапуск сервиса Systemd при изменении каталога (любой файл внутри него)

Вопрос или проблема

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

Вот моя настройка:

srv.service

[Unit]
Description=srv 0.1: Описание службы
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

Спасибо!

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

Чтобы прояснить, вам нужно:

srv.service

[Unit]
Description=srv 0.1: Описание службы
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
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

Ответ выше почти идеален, но в нем отсутствует несколько моментов, которые мне потребовалось время, чтобы понять. Другие столкнутся с теми же проблемами, смотрите раздел комментариев.

systemctl enable srv-watcher.{path,service}
systemctl start srv-watcher.{path,service}

srv.service

[Unit]
Description=srv 0.1: Описание службы
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
After=network.target
StartLimitIntervalSec=10
StartLimitBurst=5

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

[Install]
WantedBy=multi-user.target

srv-watcher.path

[Path]
Unit=srv-watcher.service
PathChanged=/opt/srv/lib 
# запускать при изменениях в файле, а не только создании/удалении
# не оставляйте комментарии в одной строке с командой

[Install]
WantedBy=multi-user.target

Если все работает, вы увидите эти сообщения в journalctl

$: journalctl -f -o cat -u srv-watcher
Начало srv-watcher...                                                                                          
Запущен srv-watcher.

Другие вещи, о которых стоит помнить: путь может срабатывать много раз, но srv-watcher.service будет уважать стандартный лимит в 5 перезапусков за 10-секундные интервалы. https://www.freedesktop.org/software/systemd/man/systemd.unit.html#StartLimitIntervalSec=interval

Ответы выше отличные, я не думаю, что WantedBy=multi-user.target для srv-watcher.service необходим.

Ответ или решение

Для автоматического перезапуска системы systemd при изменении файлов в каталоге, например, для сервиса Java, необходимо правильно настроить соответствующие файлы единиц (.service и .path). Ниже представлены шаги для реализации этой задачи.

1. Создание файла сервиса srv.service

Файл srv.service отвечает за запуск вашего основного приложения. Пример содержимого:

[Unit]
Description=srv 0.1: Описание сервиса
After=network.target

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

[Install]
WantedBy=multi-user.target

2. Создание файла, отслеживающего изменения srv-watcher.service

Этот файл будет использоваться для перезапуска основного сервиса при изменении файлов:

[Unit]
Description=srv restarter
After=network.target
StartLimitIntervalSec=10
StartLimitBurst=5

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

[Install]
WantedBy=multi-user.target

3. Создание файла пути srv-watcher.path

Этот файл будет отслеживать изменения в указанном каталоге:

[Unit]
Unit=srv-watcher.service

[Path]
PathChanged=/opt/srv/lib

[Install]
WantedBy=multi-user.target

4. Включение и запуск служб

После создания всех трех файлов, выполните следующие команды для их активации:

sudo systemctl daemon-reload
sudo systemctl enable srv.service
sudo systemctl enable srv-watcher.service
sudo systemctl enable srv-watcher.path
sudo systemctl start srv-watcher.path
sudo systemctl start srv.service

5. Проверка работоспособности

Для проверки того, что ваш srv-watcher работает правильно, вы можете наблюдать за логами с помощью следующей команды:

journalctl -f -u srv-watcher.service

Если все настроено правильно, в логах должны появляться сообщения, подтверждающие запуск srv-watcher и перезапуск основного сервиса.

Заключение

Учтите, что srv-watcher может быть вызван несколько раз при частых изменениях, но из-за настройки StartLimitIntervalSec и StartLimitBurst, система ограничит количество перезапусков, чтобы избежать перегрузки. Это полезно в сценариях, когда разработка и развертывание ведется часто. Убедитесь, что права доступа к каталогам и файлам корректны, и что ваш сервис настроен для корректной работы с systemd.

Оцените материал
Добавить комментарий

Капча загружается...