У systemd есть удобный механизм, о котором часто забывают - systemd.path. Он позволяет следить за событиями в файловой системе и запускать нужный .service, когда файл или каталог изменился.
Например:
изменился конфиг - перезапустить сервис
появился файл - запустить обработчик
обновился сертификат - скопировать его и сделать reload
▪️ Пример: реагируем на изменение конфига. Допустим, нужно выполнить действие при изменении файла:
/etc/daemon/daemon.conf
Создаем unit:
/etc/systemd/system/daemon.path
[Unit]
Description=Watch /etc/daemon/daemon.conf for changes
[Path]
PathModified=/etc/daemon/daemon.conf
[Install]
WantedBy=multi-user.target
Этот .path будет следить за изменением файла.
▪️ Сервис, который запустится по событию. Теперь создаем:
/etc/systemd/system/daemon.service
[Unit]
Description=Run action after daemon.conf change
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo "daemon config changed at $(date)" >> /etc/daemon/restart.date'
Для примера сервис просто пишет дату события в файл:
/etc/daemon/restart.date
На практике в ExecStart можно указать любой скрипт:
• перезапуск сервиса;
• reload nginx;
• копирование файла;
• отправка алерта;
• валидация конфига.
▪️ Включаем и запускаем
systemctl daemon-reload
systemctl enable --now daemon.path
Проверяем статус:
systemctl status daemon.path
Теперь изменяем файл:
echo "# test" >> /etc/daemon/daemon.conf
И смотрим результат:
cat /etc/daemon/restart.date
Должна появиться новая строка с текущей датой.
▪️ Почему это удобно. Главный плюс- все работает через systemd. Значит, события и ошибки можно смотреть привычно:
journalctl -u daemon.path
journalctl -u daemon.service
Не нужно писать отдельный бесконечный watcher на bash или городить cron.
▪️ Полезные директивы
[Path]
PathModified=/path/file
Срабатывает при изменении файла.
PathChanged=/path/file
Срабатывает после закрытия файла, в который была запись.
PathExists=/path/file
Срабатывает, когда файл или каталог появился.
PathExistsGlob=/path/*.conf
То же самое, но с маской.
DirectoryNotEmpty=/path/dir
Срабатывает, когда в пустом каталоге появился файл.
#linux #systemd
🧑💻 NetworkAdmin