Инструкции · 4 min read · Nov 11, 2025

Срабатывание команд при изменении файлов/каталогов с помощью Incron на Debian Etch

Этот гид показывает, как установить и использовать incron на системе Debian Etch. Incron похож на cron, но вместо выполнения команд по времени, он может запускать команды, когда происходят события с файлами или каталогами (например, изменение файла, изменения прав и т.д.).

Этот документ предоставляется без каких-либо гарантий! Я не даю никаких гарантий, что это будет работать для вас!

1 Установка Incron

Incron доступен в репозитории etch-backports, поэтому нам нужно добавить следующую строку в /etc/apt/sources.list:

vi /etc/apt/sources.list

| [...] deb http://www.backports.org/debian etch-backports main contrib non-free [...] |

Давайте импортируем ключ архива backports.org в apt…

wget -O - http://backports.org/debian/archive.key | apt-key add -

… и запустим

apt-get update

Репозиторий etch-backports по умолчанию неактивен, поэтому для установки incron из него мы должны использовать следующую команду:

apt-get -t etch-backports install incron

2 Использование Incron

Использование Incron очень похоже на использование cron. У вас есть команда incrontab, которая позволяет вам перечислять ( -l), редактировать ( -e) и удалять ( -r) записи incrontab. Чтобы узнать больше об этом, смотрите

man incrontab

Там вы также найдете следующий раздел:

Если /etc/incron.allow существует, только пользователи, указанные здесь, могут использовать incron. В противном случае, если /etc/incron.deny существует, только пользователи, НЕ указанные здесь, могут использовать incron. Если ни один из этих файлов не существует, всем разрешено использовать incron. (Важно: это поведение небезопасно и, вероятно, будет изменено, чтобы быть совместимым со стилем, используемым ISC Cron.) Местоположение этих файлов может быть изменено в конфигурации.

Это означает, что если мы хотим использовать incrontab от имени root, мы должны либо удалить /etc/incron.allow (что небезопасно, потому что тогда каждый системный пользователь сможет использовать incrontab)…

rm -f /etc/incron.allow

… или добавить root в этот файл (рекомендуется):

vi /etc/incron.allow

| root |

Перед тем как вы это сделаете, вы получите сообщения об ошибках, подобные этому, когда попытаетесь использовать incrontab:

server1:~# incrontab -l  
user 'root' is not allowed to use incron  
server1:~#

После этого все будет работать:

server1:~# incrontab -l  
no table for root  
server1:~#

Мы можем использовать

incrontab -e

чтобы создать задания incron. Прежде чем мы это сделаем, мы взглянем на

man 5 incrontab

потому что это объясняет формат crontabs. В основном формат выглядит следующим образом…

  

…где может быть каталогом (что означает, что каталог и/или файлы непосредственно в этом каталоге (не файлы в подкаталогах этого каталога!) отслеживаются) или файлом.

может быть одним из следующих: ``` 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 определяется как битовая маска всех вышеуказанных событий. Два дополнительных удобных символа - IN_MOVE, который является комбинацией IN_MOVED_FROM и IN_MOVED_TO, и IN_CLOSE, который объединяет IN_CLOSE_WRITE и IN_CLOSE_NOWRITE. Следующие дополнительные символы могут быть указаны в маске: ``` IN_DONT_FOLLOW Не разыменовывать путь, если это символическая ссылка IN_ONESHOT Мониторить путь только для одного события IN_ONLYDIR Только отслеживать путь, если это каталог ``` Дополнительно есть символ, который не появляется в наборе символов inotify. Это IN_NO_LOOP. Этот символ отключает мониторинг событий, пока текущее событие полностью не будет обработано (пока его дочерний процесс не завершится). - это команда, которая должна быть выполнена, когда происходит событие. Внутри спецификации команды могут использоваться следующие подстановочные знаки: ``` $$ знак доллара $@ отслеживаемый путь файловой системы (см. выше) $# имя файла, связанного с событием $% флаги события (в текстовом виде) $& флаги события (в числовом виде) ``` Если вы отслеживаете каталог, то $@ содержит путь к каталогу, а $# - файл, который вызвал событие. Если вы отслеживаете файл, то $@ содержит полный путь к файлу, а $# пуст. Если вам нужны подстановочные знаки, но вы не уверены, что они означают, вы можете создать задание incron, как это: | ``` /tmp/ IN_MODIFY echo "$ $@ $# $% $&" ``` | Затем вы создаете или изменяете файл в каталоге /tmp и смотрите на /var/log/syslog - этот журнал показывает, когда было вызвано задание incron, успешно ли оно выполнено или были ошибки, и какая команда была фактически выполнена (т.е. подстановочные знаки заменяются их реальными значениями). ``` tail /var/log/syslog ``` ``` ... Aug 21 17:26:50 server1 incrond[7111]: (root) CMD (echo "$ /tmp huhu IN_CREATE 256") ``` В этом примере я создал файл /tmp/huhu; как вы видите, $@ переводится в /tmp, $# в huhu, $% в IN_CREATE, а $& в 256. Теперь достаточно теории. Давайте создадим наши первые задания incron. Я хотел бы отслеживать файл /etc/apache2/apache2.conf и каталог /etc/apache2/vhosts/, и всякий раз, когда происходят изменения, я хочу, чтобы incron перезапускал Apache. Вот как мы это делаем: ``` incrontab -e ``` | ``` /etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart /etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart ``` | Вот и все. Для тестирования вы можете изменить свою конфигурацию Apache и посмотреть на /var/log/syslog, и вы должны увидеть, что incron перезапускает Apache. Чтобы перечислить все определенные задания incron, вы можете выполнить ``` incrontab -l ``` ``` server1:~# incrontab -l /etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 restart /etc/apache2/vhosts/ IN_MODIFY /etc/init.d/apache2 restart server1:~# ``` Чтобы удалить все задания incron текущего пользователя, выполните ``` incrontab -r ``` ``` server1:~# incrontab -r removing table for user 'root' table for user 'root' successfully removed server1:~# ``` ### 3 Ссылки - incron: http://inotify.aiken.cz/?section=incron&page=about&lang=en
Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.