Поиск по сайту:

Как запускать команды при изменении файла или каталога с помощью Incron в Ubuntu 16.04


Это руководство существует для этих версий ОС

  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 15.10 (Wily Werewolf)

На этой странице

  1. 1 Установка Инкрона
  2. 3 Как использовать Инкрон
  3. 4 ссылки

В этом руководстве показано, как использовать incron в системе Ubuntu 16.04 (Xenial Xerus) для запуска команд при изменении файла или каталога. Демон incron похож на cron, но вместо запуска команд в зависимости от времени он может запускать команды, когда происходит событие файла или каталога (например, изменение файла, изменение разрешений и т. д.).

1 Установка Инкрона

Следующие шаги должны выполняться от имени пользователя root. Пожалуйста, войдите в оболочку вашей системы Ubuntu и станьте пользователем root с помощью:

sudo -s

Программное обеспечение Incron доступно в репозитории Ubuntu. Поэтому я буду устанавливать его с apt следующим образом:

apt-get -y install incron

3 Как использовать Инкрон

Как упоминалось в первой главе, Incron во многом похож на инструмент Cron. Там, где у Cron есть команда crontab для управления заданиями cron, у Incron есть команда incrontab. Вы можете использовать список параметров команды incrontab (-l), редактировать (-e) и удалять (-r), чтобы отображать и изменять записи incrontab.

Выполните следующую команду, чтобы получить полный обзор incrontab:

man incrontab

На странице руководства вы найдете следующее примечание:

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

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

rm -f /etc/incron.allow

... или мы добавляем пользователя root в файл incron.allow (что является рекомендуемым вариантом). Откройте файл /etc/incron.allow:

nano /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

Страница руководства показывает формат строк вкладок cron. Формат следует этой схеме:

<path> <mask> <command>

...где <путь> – это каталог или файл. Обратите внимание, что incron не может просматривать файлы в подкаталогах заданного вами каталога, поэтому будут наблюдаться только файлы в этом каталоге.

может быть одним из следующих вариантов:

IN_ACCESS           File was accessed (read) (*)
IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE      File opened for writing was closed (*)
IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
IN_CREATE           File/directory created in watched directory (*)
IN_DELETE           File/directory deleted from watched directory (*)
IN_DELETE_SELF           Watched file/directory was itself deleted
IN_MODIFY           File was modified (*)
IN_MOVE_SELF        Watched file/directory was itself moved
IN_MOVED_FROM       File moved out of watched directory (*)
IN_MOVED_TO         File moved into watched directory (*)
IN_OPEN             File was opened (*)

При наблюдении за каталогом события, отмеченные выше звездочкой (*), могут происходить для файлов в каталоге, и в этом случае поле имени в возвращаемых данных события
идентифицирует имя файла в каталоге.

Символ IN_ALL_EVENTS определяется как битовая маска всех вышеперечисленных событий. Два дополнительных символа удобства: IN_MOVE, который представляет собой комбинацию IN_MOVED_FROM и IN_MOVED_TO, и IN_CLOSE, который сочетает в себе IN_CLOSE_WRITE и IN_CLOSE_NOWRITE.

В маске могут быть указаны следующие дополнительные символы:

IN_DONT_FOLLOW      Don't dereference pathname if it is a symbolic link
IN_ONESHOT          Monitor pathname for only one event
IN_ONLYDIR          Only watch pathname if it is a directory

Кроме того, есть символ, которого нет в наборе символов inotify. Это IN_NO_LOOP. Этот символ отключает отслеживание событий до тех пор, пока текущее событие не будет полностью обработано (пока его дочерний процесс не завершится).

— это команда, которая должна быть запущена при возникновении события. В спецификации команды могут использоваться следующие подстановочные знаки:

$$   dollar sign
   watched filesystem path (see above)
$#   event-related file name
$%   event flags (textually)
$&   event flags (numerically)

Если вы просматриваете каталог, то [email содержит полный путь к файлу, а $# пуст.

Если вам нужны подстановочные знаки, но вы не уверены, что они переводят, вы можете создать задание incron, подобное этому.

Создайте каталог, за которым нужно следить:

mkdir /tmp/testdir

Затем откройте инкронтаб:

incrontab -e

и добавьте следующую строку:

/tmp/testdir/ IN_MODIFY echo "$$  $# $% $&"

Затем вы создаете или изменяете файл в каталоге /tmp/testdir/ и смотрите в /var/log/syslog — этот журнал показывает, когда запускалось задание incron, было ли оно успешным или были ли ошибки, а также какие фактические данные команда была выполнена (т. е. подстановочные знаки заменены их реальными значениями).

В целях тестирования я добавлю два файла, helloworld.txt и helloworld2.txt, в папку /tmp/testdir/ с помощью команды echo:

echo 'How are you?' > /tmp/testdir/helloworld.txt
echo 'How are you?' > /tmp/testdir/helloworld2.txt

Итак, давайте проверим системный журнал с хвостом на наличие некронов:

tail /var/log/syslog
...
Apr 12 18:49:22 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
Apr 12 18:50:31 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")

Теперь достаточно теории. Давайте создадим наши первые задания incron. Я хотел бы отслеживать файл /etc/apache2/apache2.conf и каталог /etc/apache2/vhosts/, и всякий раз, когда есть изменения, я хочу, чтобы incron перезапускал Apache. Вот как мы это делаем:

incrontab -e
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart

Вот и все. В целях тестирования вы можете изменить конфигурацию Apache и заглянуть в /var/log/syslog, и вы должны увидеть, что incron перезапускает Apache.

ПРИМЕЧАНИЕ. Не выполняйте никаких действий из задания incron в отслеживаемом каталоге, чтобы избежать зацикливания. Пример. Когда вы отслеживаете изменения в каталоге /tmp и каждое изменение запускает сценарий, который записывает файл журнала в /tmp, это может привести к зацикливанию и может привести к высокой нагрузке на вашу систему или даже к ее сбою.

Чтобы получить список всех определенных заданий incron, вы можете запустить:

incrontab -l
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
server1:~#

Чтобы удалить все задания incron текущего пользователя, запустите:

incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#

4 ссылки

  • инкрон: http://inotify.aiken.cz/?section=incron&page=about&lang=en