Как запускать команды при изменении файла/каталога с помощью Incron в Debian 8
Это руководство существует для этих версий ОС
- Debian 4 (Etch)
На этой странице
- 1 Предпосылки
- 2 Установка Инкрона
- 3 Использование Инкрона
- 4 ссылки
В этом руководстве показано, как установить и использовать incron в системе Debian 8 (Jessie). 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:~#
После этого работает:
server1:~# incrontab -l
no table for root
server1:~#
Мы можем использовать команду:
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
...
Sep 16 10:14:35 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Sep 16 10:14:36 server1 incrond[1199]: (root) CMD (echo "$ /tmp .hello.txt.swp IN_MODIFY 2")
Sep 16 10:14:39 server1 incrond[1199]: (root) CMD (echo "$ /tmp hello.txt IN_MODIFY 2")
Sep 16 10:14:39 server1 incrond[1199]: (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
server1:~#
Чтобы удалить все задания incron текущего пользователя, запустите:
incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#
4 ссылки
- Debian http://www.debian.org
- инкрон: http://inotify.aiken.cz/?section=incron&page=about&lang=en