Для отслеживания изменения на файловой системе Linux используется подсистема ядра inotify. Inotify позволяет, например выполнить определенное действие (команду) при создании, модификации, чтении или удалении файла или директории.
В современных дистрибутивах Linux, основанных на подсистеме инициализации и управления службами systemd, для отслеживания событий файловой системе гораздо удобнее использовать юниты path. По сути, это высокоуровневая настройка над inotify, которая позволяет просто и удобно создать триггеры на события файловой системы.
Создадим простой юнит, который будет отслеживать изменение файла в указанной директории и выполнять определенное действие (скрипт). К примеру, создадим юнит, который будет отслеживать изменения в файле /etc/passwd и отправлять письмо на email адрес.
Создайте скрипт:
$ sudo mcedit /usr/local/bin/passwd-change-alert.sh
#!/bin/bash mail -S sendwait -s "passwd file changed on $(hostname)" admin@vmblog.ru < /etc/passwd
Разрешить запуск скрипта:
$ sudo chmod +x email-alert.sh
Создать юнит для запуска скрипта:
$ sudo mcedit /etc/systemd/system/passwd-change.service
[Unit] Description="Send email alert" [Service] ExecStart=/usr/local/bin/passwd-change-alert.sh
Теперь нужно создать юнит типа path:
$ sudo mcedit /etc/systemd/system/passwd-change.path
[Unit] Description="Check for /etc/passwd changes" [Path] PathModified=/etc/passwd Unit=passwd-change.service [Install] WantedBy=multi-user.target
- PathModified – указывает, что юнит должен отслеживать изменения в файле
- Unit – запустить указанный сервис, когда файл был изменен.
systemd.path
работает только с локальными файловыми системами и не будет работать с подключенными каталогами SMB ресурсами (подключение сетевых SMB папок в Linux) или NFS каталогами. Обновите конфигурацию systemd:
$ systemctl daemon-reload
Запустите юнит и добавьте его в автозагрузку:
$ sudo systemctl enable --now passwd-change.path
Для просмотра истории срабатывания триггера файловой системы воспользуйтесь командой:$ sudo journalctl -u passwd-change.path
В юните path можно отслеживать различные события файловой системы. Вместо PathModified можно указать:
- PathExists — проверяет существование файла;
- PathExistsGlob – аналогично предыдущей директиве, но можно указывать файлы /каталоги по маске
- PathChanged – отслеживать изменение файла (срабатывает при сохранении изменений)
- PathModified – отслеживает модификацию файла (срабатывает сразу, не дожидаясь окончания редактирования)
- DirectoryNotEmpty – отслеживает появление файлов в директории. Здесь можно использовать дополнительные опции MakeDirectory (при true – создаст каталог отслеживания автоматически), DirectoryMode (задать права на каталог, по умолчанию 0755)
Дополнительные опции:
- TriggerLimitIntervalSec – юнит будет срабатывать не чаще указанного промежутка временем (2 сек по умолчанию)
- TriggerLimitBurst -максимальное количество активаций юнита за указанное время (по умолчанию 200). При превышении этого значения юнит перейдет в режим сбоя и не будет работать до перезапуска.
В секции [Path] можно одновременно отслеживать несколько объектов файловой системы. Юнит будет запущен при выполнении любого из условий.