Как запускать команды при изменении файла или каталога с помощью Incron в Ubuntu 16.04
Это руководство существует для этих версий ОС
- Ubuntu 16.04 (Xenial Xerus)
- Ubuntu 15.10 (Wily Werewolf)
На этой странице
- 1 Установка Инкрона
- 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