Аватар

ramas

02 октября 2024


Перезапуск systemd сервиса при изменении файла на диске

systemd

Введение

Ранее это краткая заметка, сейчас неполноценный туториал. В ней вы узнаете, как настроить автоматическую перезагрузку systemd сервиса при изменении файла в директории.

Основной systemd сервис

Создадим основной systemd юнит, который требуется перезапускать при изменения файла в директории.

# sudo nano /etc/systemd/system/my_project.service

[Unit]
Description=My Test Projectt

[Service]
ExecStart=/usr/bin/python3 /home/user1/main.py

[Install]
WantedBy=multi-user.target

В данном примере сервис запускает простое Python приложение, которое выводит текущее время.

# sudo nano home/user1/main.py

from datetime import datetime
import logging
import time

logging.basicConfig(level=logging.INFO)
now = datetime.now()

while True:
    logging.info(f'Время: {now.strftime("%d.%m.%Y %H:%M")}')
    time.sleep(60)

Активируем и добавим сервис в автозагрузку.

sudo systemctl enable --now my_project

Посмотрим логи, и убедимся что все работает.

# sudo journalctl -u my_project

Sep 30 21:46:04 ramzis.ru systemd[1]: Started my_project.service - My Test Projectt.
Sep 30 21:46:04 ramzis.ru python3[1412]: INFO:root:Время: 30.09.2024 21:46

Вспомогательный сервис

Создим вспомогательный сервис, задачей которого будет перезапустить основной my_project юнит.

# sudo nano /etc/systemd/system/my_project_restart.service

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

Далее создадим .path юнит, который будет отслеживать изменения файла /home/user1/restart.json и запускать связанный с ним my_project_restart сервис.

# sudo nano /etc/systemd/system/my_project_restart.path

[Path]
PathChanged=/home/user1/restart.json

[Install]
WantedBy=multi-user.target

Активируем и запустим.

sudo systemctl enable --now my_project_restart.path

Для того чтобы перезапустить сервис, достаточно что нибудь записать в файл /home/user1/restart.json

echo "0" > restart.json

Посмотрим логи основного сервиса и убедимся, что он перезапустился.

# sudo journalctl -u my_project

Sep 30 21:55:49 ramzis.ru systemd[1]: Stopped my_project.service - My Test Projectt.
Sep 30 21:55:49 ramzis.ru systemd[1]: Started my_project.service - My Test Projectt.
Sep 30 21:55:49 ramzis.ru python3[1580]: INFO:root:Время: 30.09.2024 21:55