Этот гид показывает, как установить и использовать incron на системе Debian Etch. Incron похож на cron, но вместо выполнения команд по времени, он может запускать команды, когда происходят события с файлами или каталогами (например, изменение файла, изменения прав и т.д.).
Этот документ предоставляется без каких-либо гарантий! Я не даю никаких гарантий, что это будет работать для вас!
1 Установка Incron
Incron доступен в репозитории etch-backports, поэтому нам нужно добавить следующую строку в /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 -
… и запустим
Репозиторий etch-backports по умолчанию неактивен, поэтому для установки incron из него мы должны использовать следующую команду:
apt-get -t etch-backports install incron
2 Использование Incron
Использование Incron очень похоже на использование cron. У вас есть команда incrontab, которая позволяет вам перечислять ( -l), редактировать ( -e) и удалять ( -r) записи incrontab. Чтобы узнать больше об этом, смотрите
Там вы также найдете следующий раздел:
Если /etc/incron.allow существует, только пользователи, указанные здесь, могут использовать incron. В противном случае, если /etc/incron.deny существует, только пользователи, НЕ указанные здесь, могут использовать incron. Если ни один из этих файлов не существует, всем разрешено использовать incron. (Важно: это поведение небезопасно и, вероятно, будет изменено, чтобы быть совместимым со стилем, используемым ISC Cron.) Местоположение этих файлов может быть изменено в конфигурации.
Это означает, что если мы хотим использовать incrontab от имени root, мы должны либо удалить /etc/incron.allow (что небезопасно, потому что тогда каждый системный пользователь сможет использовать incrontab)…
… или добавить root в этот файл (рекомендуется):
| root |
Перед тем как вы это сделаете, вы получите сообщения об ошибках, подобные этому, когда попытаетесь использовать incrontab:
server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#
После этого все будет работать:
server1:~# incrontab -l
no table for root
server1:~#
Мы можем использовать
чтобы создать задания incron. Прежде чем мы это сделаем, мы взглянем на
потому что это объясняет формат 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