Как следить за изменением файлов в 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
Что еще?
- В ExecStart сервис-юнита можно сразу указывать бинарник с параметрами, например так я отправляю данные в Zabbix Trapper:
ExecStart=/bin/zabbix_sender -z zabbix.server -s hostname -k itemkey -o "1"
- Помимо PathChanged есть несколько других параметров