Как следить за изменением файлов в CentOS/RHEL через path units?

При запуске демона, systemd читает его конфигурацию из коллекции юнит-файлов. Есть специальные path-юниты, которые позволяют мониторить события, связанные с директориями и файлами. Если определенное событие наступает, запускается сервис-юнит.

Допустим, мы хотим знать об изменениях файла test в домашней директории.

Создаем path-юнит /etc/systemd/system/example.path

[Unit]
Description=Monitor test file for changes
[Path]
PathChanged=/home/omavel/test
Unit=example.service
[Install]
WantedBy=multi-user.target

PathChanged абсолютный путь до файла
Unit название сервис-юнита который мы опишем дальше, он будет запускаться при изменении файла. Можно не указывать, если название сервиса совпадает с path-юнитом (в приведенном примере они совпадают — example.path, example.service)
WantedBy юнит запускается в режиме multi-user операционной системы. Проверить можно командой

systemctl get-default

Далее создаем сервис-юнит /etc/systemd/system/example.service

[Unit]
Description=Executes script when a file has changed
[Service]
Type=simple
ExecStart=/home/omavel/script.sh
[Install]
WantedBy=multi-user.target

Заведем скрипт /home/omavel/script.sh, который будет запускаться сервисом
Скрипт отмечает факт изменения файла в output.log

#!/bin/bash
echo "`date` file changed" >> /home/omavel/output.log

Сделаем скрипт исполняемым

chmod +x /home/omavel/script.sh

Включим автоматический запуск обоих юнитов при загрузке и запустим path

systemctl enable example.{path,service}
systemctl start example.path

Протестируем

echo > /home/omavel/test

В логе должна появиться новая строка
Mon Jul 15 10:15:20 MSK 2019 file changed

Таким образом

  • Path-юнит запущен всегда и следит за изменениями файла
  • При наступлении события, он запускает сервис-юнит
  • Сервис-юнит запускает скрипт (или что угодно)
  • Скрипт пишет в лог (или куда угодно)

Ограничения

  • Способ не подходит для мониторинга NFS, так как использует inotyfy API

Что еще?

  1. В ExecStart сервис-юнита можно сразу указывать бинарник с параметрами, например так я отправляю данные в Zabbix Trapper:
ExecStart=/bin/zabbix_sender -z zabbix.server -s hostname -k itemkey -o "1"
  1. Помимо PathChanged есть несколько других параметров
Отправить
Поделиться