Демон incrond inotify отслеживает каталоги на предмет изменений и принимает меры
inotify - это технология уведомления файловой системы на основе inode. Она предоставляет возможность отслеживать различные события, происходящие с файлами в файловых системах. Это очень хорошая замена (устаревшей) dnotify. inotify предлагает удобный способ управления файлами, используемыми в приложениях.
incrond (inotify cron daemon) - это демон, который отслеживает события в файловой системе (такие как добавление нового файла, удаление файла и так далее) и выполняет команды или сценарии оболочки. Его использование в целом похоже на cron, только cron работает по времени, а incrond отслеживает изменения файловой системы.
Как установить incrond
RHEL / Fedora / CentOS Linux:
$ sudo yum install incron
Debian / Ubuntu Linux:
$ sudo apt-get install incron
Конфигурационные файлы
- /etc/incron.conf - Главный конфигурационный файл incron
- /etc/incron.d/ - Эта директория исследуется incrond для файлов системных таблиц. Вы должны поместить сюда все ваши конфигурационные файлы в соответствии с именами директорий или доменов.
- /etc/incron.allow - Этот файл содержит пользователей, которым разрешено использовать incron.
- /etc/incron.deny - Этот файл содержит пользователей, которым запрещено использовать incron.
- /var/spool/incron - Этот каталог проверяется incrond на наличие файлов пользовательских таблиц, которые устанавливаются пользователями, выполняющими команду incrontab.
incron синтакс
<directory> <file change mask> <command or action> options
Примеры
/var/www/html IN_CREATE /root/scripts/backup.sh /sales IN_DELETE /root/scripts/sync.sh /var/named/chroot/var/master IN_CREATE,IN_ATTRIB,IN_MODIFY /sbin/rndc reload
<directory> Путь, который является абсолютным путем к файловой системе, например /home/data. Любые изменения, внесенные в этот путь, приведут к выполнению команды или действия.
<file change mask> Маска - это не что иное, как различные события файловой системы, такие как удаление файла. Каждое событие может привести к выполнению команды.
Аттрибут | Описание |
---|---|
IN_ACCESS | К файлу был получен доступ (чтение) |
IN_ATTRIB | Изменены метаданные (разрешения, временные метки, расширенные атрибуты и т. д.) |
IN_CLOSE_WRITE | Файл, открытый для записи, был закрыт |
IN_CLOSE_NOWRITE | Файл, не открытый для записи, был закрыт |
IN_CREATE | Файл/директория создан в наблюдаемом каталоге |
IN_DELETE | Файл/директория удалены из наблюдаемой директории |
IN_DELETE_SELF | Наблюдаемый файл/каталог был удален самостоятельно |
IN_MODIFY | Файл был изменен |
IN_MOVE_SELF | Наблюдаемый файл/каталог был перемещен |
IN_MOVED_FROM | Файл был перемещен из наблюдаемой директории |
IN_MOVED_TO | Файл перемещен в наблюдаемую директорию |
IN_OPEN | Файл был открыт |
Символ |IN_ALL_EVENTS| определяется как битовая маска всех вышеперечисленных событий.|
<command or action> Run command or scripts when mask matched on given directory.|
options It can be any one of the following with command (i.e. you can pass it as arg to your command):|
Аттрибут | Описание |
---|---|
$$ | знак доллара |
$@ | путь к наблюдаемой файловой системе (см. выше) |
$# | имя файла, связанного с событием |
$% | флаги события (в текстовом виде) |
$& | флаги события (численно) |
Включить сервис
CentOS/RHEL:
# service incrond start
# chkconfig incrond on
###################################################
###
systemd based Linux distro such as CentOS/RHEL 7.x/8.x, try
##
###################################################
# systemctl enable incrond.service
# systemctl start incrond.service
Linux incrond inotify monitor dir for changes and take action
Type the following command to edit your incrontab
incrontab -e
Run logger command when file created or deleted from /tmp directory:
/tmp IN_ALL_EVENTS logger "/tmp action for $# file"
Save and close the file. Now cd to /tmp and create a file:
$ cd /tmp
$ >foo
$ rm foo
To see message, enter:
$ sudo tail -f /var/log/messages
Sample outputs:
Jul 17 18:39:25 vivek-desktop logger: "/tmp action for foo file"
How Do I Run Rsync Command To Replicate Files For /var/www/html/upload Directory?
Type the following command:
# incrontab -e
Append the following command:
/var/www/html/upload/ IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/
Now, wherever files are uploaded in /var/www/html/upload/ directory, rsync will be executed to sync files to www2.example.com server. Make sure ssh keys are set for password less login.
How Do I Monitor /var/www/html/upload/ and Its Subdirectories Recursively?
You cannot monitor /var/www/html/upload/ directory recursively. However, you can use the find command to add all sub-directories as follows:
find /var/www/html/upload -type d -print0 | xargs -0 -I{} echo "{} IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/" > /etc/incron.d/webroot.conf
This will create /etc/incron.d/webroot.conf config as follows:
/var/www/html/upload IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/css IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/1 IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/js IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/3 IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/2010 IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/2010/11 IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/2010/12 IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/2 IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/files IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/ /var/www/html/upload/images IN_CLOSE_WRITE,IN_CREATE,IN_DELETE /usr/bin/rsync --exclude '*.tmp' -a /var/www/html/upload/ user@www2.example.com:/var/www/html/upload/
How Do I Troubleshoot Problems?
You need to see /var/log/cron log file:
# tail -f /var/log/cron
# grep something /var/log/cron
Further readings:
- inotify project home page here
- man pages – incrontab(5), incrond, and incron.conf