Вопрос или проблема
Как перезапустить службу 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
.