Гид по технологиям

Incron на Ubuntu 16.04: отслеживание файлов и запуск команд

• 7 min read • Системное администрирование • Обновлено 27 Nov 2025
Incron на Ubuntu 16.04 — автозапуск при изменениях
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

Установка Incron на Ubuntu 16.04

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:~#

Отладка и типичные проблемы

  1. Права доступа: убедитесь, что пользователь, под которым вы редактируете incrontab, разрешён в /etc/incron.allow (или отсутствует /etc/incron.deny соответственно).
  2. Логи: основной источник информации — /var/log/syslog. В нём incrond пишет, какие команды запускал и возникали ли ошибки при их выполнении.
  3. Команды не выполняются: проверьте, доступны ли пути к утилитам (полные пути предпочтительны), окружение (PATH) и права на исполнение. Incron запускает команды в минимальном окружении.
  4. Циклы: используйте IN_NO_LOOP и проектируйте команды так, чтобы они не модифицировали наблюдаемый каталог или использовали временные файлы вне наблюдаемого пути.
  5. Ограничения 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 после включения правил.

Тесты и приёмка (короткая методология)

  1. Создать тестовый каталог /tmp/testdir и добавить тестовую запись, печатающую подстановки.
  2. Выполнить изменение файла и проверить /var/log/syslog на соответствующую запись.
  3. Для production-правил смоделировать изменение конфигурации и убедиться, что сервис корректно перезапускается и проходит базовые health-checks.
  4. Наблюдать систему 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 для скриптовых решений.

Полезные ссылки


Сводка действий (playbook):

  1. Установить incron: apt-get -y install incron
  2. Добавить root в /etc/incron.allow
  3. Создать и протестировать incrontab через incrontab -e
  4. Проверить /var/log/syslog и убедиться в отсутствии циклов
  5. Перевести критичные правила на systemd.path при миграции ОС
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро