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

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


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

  • Debian 9 (расширенная версия)
  • Debian 4 (расширенная версия)

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

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

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

1 Предпосылки

  • Разрешения системного администратора (вход root). Все команды в этом руководстве должны выполняться от имени пользователя root в оболочке.
  • Я буду использовать редактор \nano\ для редактирования файлов. Вы можете заменить nano редактором по вашему выбору или установить nano с помощью \apt-get install nano\, если он не установлен на вашем сервере.

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

Инкрон доступен в репозитории Debian, поэтому мы устанавливаем его с помощью следующей подходящей команды:

apt-get install incron

Процесс установки должен быть похож на тот, что на этом снимке экрана.

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

Использование 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 в этот файл (рекомендуется). Откройте файл /etc/incron.allow с помощью nano:

nano /etc/incron.allow

И добавьте следующую строку. Затем сохраните файл.

root

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

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

После этого работает:

server1:~# incrontab -l
no table for root

Мы можем использовать команду:

incrontab -e

Для создания рабочих мест incron. Прежде чем мы это сделаем, мы взглянем на справочную страницу incron:

man 5 incrontab

Страница руководства объясняет формат crontabs. В общем, формат такой...

<path> <mask> <command>

...где <путь> может быть каталогом (имеется в виду каталог и/или файлы непосредственно в этом каталоге (не файлы в подкаталогах этого каталога!)) или файл.

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

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, подобное этому. Откройте incron incrontab:

incrontab -e

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

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

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

tail /var/log/syslog
...
Jan 10 13:52:35 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Jan 10 13:52:36 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Jan 10 13:52:39 server1 incrond[1012]: (root) CMD (echo "$ /tmp hello.txt IN_MODIFY 2")
Jan 10 13:52:39 server1 incrond[1012]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")

В этом примере я редактировал файл /tmp/hello.txt; как вы видите, [email преобразуется в /tmp, $# в hello.txt, $% в IN_CREATE и $& в 256. Я использовал редактор, который создал временный файл .txt.swp. что приводит к дополнительным строкам в системном журнале.

Теперь достаточно теории. Давайте создадим наши первые задания 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

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

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

4 ссылки

  • Debian http://www.debian.org
  • Программное обеспечение Incron: http://inotify.aiken.cz/?section=incron&page=about&lang=en