Incron на Ubuntu 16.04: отслеживание файлов и запуск команд
Почему и когда использовать Incron
Incron полезен, когда нужно реагировать на изменения файловой системы сразу — например:
- автоматически перезапустить сервис после правки конфигурации;
- импортировать загруженные файлы в обработчик;
- синхронизировать изменения в каталогах с удалёнными хранилищами.
Краткое определение: incron — это демонический монитор событий inotify, который запускает команды при срабатывании выбранных масок событий для указанного пути.
Содержание
- Установка и требования
- Разрешения пользователей и incrontab
- Синтаксис записей incrontab и маски событий
- Практические примеры (тестирование, Apache)
- Отладка и логи
- Лучшие практики и безопасность
- Альтернативы и когда incron не подходит
- Чек-лист оператора и критерии приёмки
- Краткая сводка
Установка и подготовка (требуется root)
В этих шагах вы должны быть root-пользователем. Войдите в систему и станьте root:
sudo -sПакет incron доступен в репозитории Ubuntu 16.04, установите его apt:
apt-get -y install incron
ALT: Установка Incron на рабочем сервере Ubuntu 16.04 — окно терминала и команда apt-get
Important: убедитесь, что у вас есть актуальные бэкапы конфигураций и прав — индуктивные автозапуски могут влиять на сервисы в продакшне.
Разрешения: /etc/incron.allow и /etc/incron.deny
Incron реализует модель контроля доступа, схожую с ISC cron. В man указано (перевод):
Если /etc/incron.allow существует, только пользователи, перечисленные в нём, могут пользоваться incron. Иначе, если /etc/incron.deny существует, только пользователи, НЕ перечисленные в нём, могут пользоваться incron. Если ни один из этих файлов не существует, всем разрешено использовать incron. (Важно: такое поведение небезопасно и, вероятно, будет изменено). Местоположение этих файлов можно изменить в конфигурации.
Если вы хотите запускать incrontab от root, рекомендуется добавить root в /etc/incron.allow, а не удалять файл. Примеры команд:
# Не рекомендуется удалять файл, но это возможно:
rm -f /etc/incron.allow
# Рекомендуемый вариант — добавить root в список разрешённых:
nano /etc/incron.allow
# и добавить строку:
rootДо этого вы получите ошибку при попытке использовать incrontab:
server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#После добавления root в /etc/incron.allow:
server1:~# incrontab -l
no table for root
server1:~#Команды управления incron
- incrontab -e — открыть таблицу текущего пользователя для редактирования
- incrontab -l — показать текущие записи
- incrontab -r — удалить все записи текущего пользователя
- man incrontab — показать справку по формату
Пример создания/редактирования:
incrontab -eЧтобы просмотреть подробный формат:
man 5 incrontabФормат строки incrontab
Строки имеют формат:
— файл или каталог, за которым следит incron. Обратите внимание: incron не наблюдает рекурсивно подкаталоги каталога, если вы не укажете их отдельно. — набор событий (см. список ниже). — команда, выполняемая при срабатывании.
Если задан каталог, то при срабатывании имя файла внутри каталога будет доступно в переменной-заменителе ($#).
Маски событий (список и описание)
IN_ACCESS Файл был прочитан (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 Не делать dereference пути, если это символическая ссылка
IN_ONESHOT Наблюдать путь только для одного события
IN_ONLYDIR Наблюдать только если путь — каталог
IN_NO_LOOP Отключает повторное срабатывание для текущего события до завершения обработкиIN_NO_LOOP полезен для избежания ситуаций, когда команда, запущенная incron, сама модифицирует наблюдаемый каталог и вызывает новый запуск.
Подстановки (wildcards) внутри команды
В
$$ знак доллара
$@ отслеживаемый путь (директория или полный путь к файлу)
$# имя файла, связанное с событием (если наблюдается каталог)
$% флаги события (в текстовом виде)
$& флаги события (в виде числа)Пример: если наблюдать каталог, то $@ — путь каталога, а $# — имя файла внутри каталога. Если наблюдать файл, $@ — полный путь к файлу, а $# — пуст.
Пример: проверка подстановок
Создайте каталог для теста:
mkdir /tmp/testdirОткройте incrontab:
incrontab -eДобавьте строку для вывода значений подстановок:
/tmp/testdir/ IN_MODIFY echo "$$ $@ $# $% $&"После создания или изменения файла в /tmp/testdir/ в системном логе /var/log/syslog вы увидите запись с подставленными значениями. Пример тестовых команд:
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 запустил команду и подстановки заменились конкретными значениями.
Практический пример: перезапуск Apache при изменении конфигурации
Цель: отслеживать /etc/apache2/apache2.conf и /etc/apache2/vhosts/ и перезапускать Apache при изменениях.
Редактируем incrontab:
incrontab -eДобавляем строки:
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restartТеперь при изменении указанного файла или файлов в каталоге sites-available Apache будет автоматически перезапущен. Для теста модифицируйте конфигурацию и проверьте /var/log/syslog.
Important: не выполняйте действия внутри каталога, который вы мониторите, если эти действия создают новые файлы в том же каталоге — это может вызвать рекурсивные срабатывания и нагрузить систему. Пример: наблюдение /tmp/, а скрипт, запускаемый incron, пишет лог в /tmp/ — это приведёт к циклу.
Управление и удаление записей
Показать все записи текущего пользователя:
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:~#Удалить все записи текущего пользователя:
incrontab -rПример вывода удаления:
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#Отладка и типичные проблемы
- Права доступа: убедитесь, что пользователь, под которым вы редактируете incrontab, разрешён в /etc/incron.allow (или отсутствует /etc/incron.deny соответственно).
- Логи: основной источник информации — /var/log/syslog. В нём incrond пишет, какие команды запускал и возникали ли ошибки при их выполнении.
- Команды не выполняются: проверьте, доступны ли пути к утилитам (полные пути предпочтительны), окружение (PATH) и права на исполнение. Incron запускает команды в минимальном окружении.
- Циклы: используйте IN_NO_LOOP и проектируйте команды так, чтобы они не модифицировали наблюдаемый каталог или использовали временные файлы вне наблюдаемого пути.
- Ограничения inotify: ядро имеет лимиты на количество наблюдаемых объектов. Для большого числа наблюдаемых путей может понадобиться увеличить соответствующие sysctl-параметры (fs.inotify.max_user_watches и др.). Не используйте произвольно большие значения без оценки.
Note: параметры inotify в /proc/sys/fs/inotify/* не изменяются автоматически; при необходимости их корректируйте и сохраняйте в /etc/sysctl.conf.
Безопасность и конфиденциальность
- Incron запускает команды с привилегиями пользователя, от имени которого создана incrontab-запись. Не давайте write-доступ к incrontab незнакомым пользователям.
- Логи /var/log/syslog могут содержать пути и аргументы команд. Ограничьте доступ к логам по необходимости.
- Избегайте хранения чувствительных токенов или паролей в скриптах, запускаемых incron; используйте защищённые хранилища секретов.
- Для среды с повышенными требованиями к аудиту рассмотрите дополнительную систему контроля выполняемых команд (AppArmor, SELinux) и ограничьте привилегии.
Когда incron не подходит — альтернативные решения
- systemd.path (systemd) — для сервисов под управлением systemd можно использовать unit-ы типа .path, которые триггерят .service. Удобно в современных системах и хорошо интегрируется с systemctl.
- inotifywait / incrond-подобные утилиты в пользовательских скриптах — для одноразовых задач можно использовать inotify-tools и бесконечный цикл, управляющий логикой обработки.
- Cron + периодическая проверка (diff/md5) — если события происходят редко и задержка до минуты беспокоит мало, периодическая проверка проще и безопаснее.
Контрпример: если вам нужно мониторить сотни тысяч файлов или рекурсивно — incron не лучший выбор; смотрите решения уровня файловой синхронизации или специализированные демоны.
Чек-лист для оператора (роли и задачи)
- Системный администратор:
- Установил incron из репозитория
- Настроил /etc/incron.allow безопасно
- Прописал полные пути в командах incrontab
- Проверил /var/log/syslog на ошибки
- Добавил IN_NO_LOOP при необходимости
- DevOps/инженер CI:
- Тестировал скрипт запуска вручную
- Проверил, что команда не порождает новых наблюдаемых изменений
- Настроил оповещения в случае частых перезапусков
Критерии приёмки
- Для каждой incrontab-записи: при тестовом изменении файла/каталога соответствующее действие выполняется и это отражено в /var/log/syslog.
- Команда выполняется с ожидаемым результатом (например, сервис успешно перезапускается — проверено через systemctl status или curl к локальному порту).
- Нет рекурсивных срабатываний и роста CPU/IO после включения правил.
Тесты и приёмка (короткая методология)
- Создать тестовый каталог /tmp/testdir и добавить тестовую запись, печатающую подстановки.
- Выполнить изменение файла и проверить /var/log/syslog на соответствующую запись.
- Для production-правил смоделировать изменение конфигурации и убедиться, что сервис корректно перезапускается и проходит базовые health-checks.
- Наблюдать систему 5–10 минут на предмет неожиданных циклов и пиков нагрузки.
Миграционные заметки для более новых Ubuntu
Ubuntu 16.04 использует upstart/systemd гибрид; в более новых версиях systemd.path часто предпочтительнее. Если вы планируете обновление системы, проверьте совместимость существующих incron-правил и подумайте о переводе критичных правил на systemd .path unit-ы.
Быстрый пример: использование systemd.path (альтернатива)
Ниже — simple-идея: создать unit-файлы .path и .service, где .path наблюдает за файлом, а .service запускает перезапуск. Это даёт централизованную логику через systemctl и более предсказуемое окружение.
(Шаблон действий выходит за рамки этого руководства, но стоит рассмотреть при переходе на systemd.)
Краткая сводка
- Incron хорош для быстрого реагирования на события ФС в реальном времени.
- Следите за правами (/etc/incron.allow) и избегайте циклов.
- Для продакшна используйте полные пути, логируйте и ставьте ограничения.
- Рассмотрите systemd.path для тесной интеграции с systemd или inotify-tools для скриптовых решений.
Полезные ссылки
- Официальная страница incron: http://inotify.aiken.cz/?section=incron&page=about&lang=en
Сводка действий (playbook):
- Установить incron: apt-get -y install incron
- Добавить root в /etc/incron.allow
- Создать и протестировать incrontab через incrontab -e
- Проверить /var/log/syslog и убедиться в отсутствии циклов
- Перевести критичные правила на systemd.path при миграции ОС
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента