Демон incrond inotify отслеживает каталоги на предмет изменений и принимает меры

inotify - это технология уведомления файловой системы на основе inode. Она предоставляет возможность отслеживать различные события, происходящие с файлами в файловых системах. Это очень хорошая замена (устаревшей) dnotify. inotify предлагает удобный способ управления файлами, используемыми в приложениях.

incrond (inotify cron daemon) - это демон, который отслеживает события в файловой системе (такие как добавление нового файла, удаление файла и так далее) и выполняет команды или сценарии оболочки. Его использование в целом похоже на cron, только cron работает по времени, а 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.

<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

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"

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.

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/

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