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

Incron на Ubuntu: запуск команд при изменениях файлов

• 7 min read • Системное администрирование • Обновлено 19 Nov 2025
Incron на Ubuntu: запуск команд при изменениях файлов
Incron на Ubuntu: запуск команд при изменениях файлов

Incron — это демон, похожий на cron, но запускающий команды при событиях файловой системы (изменение, создание, удаление, смена прав и т.д.). Руководство показывает установку на Ubuntu, управление правами доступа, синтаксис правил, примеры (включая перезапуск Apache), тестирование, отладку, рекомендации по безопасности и чек-листы для внедрения в продакшн.

Что такое incron (в двух строках)

Incron — надстройка над inotify, которая связывает события файловой системы с командой. Простая модель: “путь + маска событий + команда”. Подходит для автоматизации перезапуска сервисов, триггеров CI, обработки загрузок и слежения за конфигурациями.

1 Установка Incron

Шаги ниже нужно выполнять от имени root. Откройте оболочку и станьте root:

sudo su

Пакет incron доступен в репозитории Ubuntu. Установите через apt:

apt-get install incron

После установки демон incrond запустится автоматически (systemd unit называется incrond). Проверьте статус:

systemctl status incrond

Важно: команды и пути в примерах приведены для Debian/Ubuntu; в других дистрибутивах пути к сервисам и имя systemd-юнита могут отличаться.

2 Разрешения: /etc/incron.allow и /etc/incron.deny

Incron использует модель контроля доступа, похожую на ISC cron. Поведение такое:

  • Если существует файл /etc/incron.allow — только пользователи в нём могут использовать incron.
  • Если нет файла incron.allow, но есть /etc/incron.deny — все, кто не в forbid-листе, могут использовать incron.
  • Если оба файла отсутствуют — любой пользователь может использовать incron (по умолчанию такое поведение небезопасно).

Если вы хотите разрешить root работать с incron, добавьте root в /etc/incron.allow (рекомендованный способ):

nano /etc/incron.allow

Добавьте строку:

root

Если права некорректны, при попытке выполнить incrontab вы увидите ошибку:

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

После добавления root в /etc/incron.allow команда incrontab -l вернёт “no table for root”.

3 Команды управления incrontab

  • Просмотреть таблицу текущего пользователя:
incrontab -l
  • Отредактировать (или создать) таблицу:
incrontab -e
  • Удалить таблицу текущего пользователя:
incrontab -r

Подробная справка доступна в man-странице:

man incrontab
man 5 incrontab

4 Синтаксис incrontab

Строка incrontab имеет формат:

  
  • — полный путь к файлу или директории. Обратите внимание: incron отслеживает непосредственно указанный путь; если вы укажете директорию, он не будет автоматически рекурсивно отслеживать поддиректории (только файлы внутри этой директории).
  • — список событий (нижнее регистровое/верхнее регистровое значение в man показано заглавными буквами). См. список далее.
  • — команда, которую нужно выполнить; в ней можно использовать подстановочные переменные (wildcards).

Доступные события (маски)

IN_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      # Не разыменовывать путь, если это символическая ссылка
IN_ONESHOT          # Мониторить путь только для одного события
IN_ONLYDIR          # Следить только если путь является директорией
IN_NO_LOOP          # Отключает генерацию новых событий до завершения обработки текущего

IN_NO_LOOP полезен, чтобы предотвратить зацикливание, если команда в ответ на событие сама меняет отслеживаемую директорию.

Подстановочные переменные в

$$   # знак доллара (для использования внутри команды)
$@   # путь, за которым наблюдают (если наблюдается файл — полный путь к файлу; если директория — путь директории)
$#   # имя файла, вызвавшего событие (пусто, если наблюдали файл напрямую)
$%   # текстовое представление флагов события
$&   # числовое значение флагов события

Пример: если вы наблюдаете директорию /tmp/testdir, то при изменении /tmp/testdir/foo.txt переменные будут: $@=/tmp/testdir, $#=foo.txt.

5 Быстрый пример: логирование подстановок

Создайте директорию для тестов:

mkdir /tmp/testdir

Откройте incrontab:

incrontab -e

Добавьте строку для отладки:

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

Создайте или измените файл в /tmp/testdir/:

echo 'How are you?' > /tmp/testdir/helloworld.txt

Проверьте системный лог (обычно /var/log/syslog):

tail /var/log/syslog

Вы увидите запись о том, какая команда была выполнена и как подстановки были заменены.

6 Практический пример: перезапуск Apache при изменениях конфигурации

Мы хотим следить за файлом /etc/apache2/apache2.conf и директорией /etc/apache2/sites-available/ и перезапускать 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

Советы для безопасного перезапуска сервисов:

  • Проверяйте конфигурацию перед перезапуском (например, для Apache: apachectl configtest). Это предотвращает применение сломанных конфигов.
  • Не запускайте тяжёлые операции напрямую из incron; лучше триггерить lightweight-скрипт, который ставит задачу в очередь или запускает systemd unit.

Пример безопасного скрипта проверки и перезапуска (/usr/local/bin/restart-apache-if-valid):

#!/bin/bash
if apachectl configtest >/dev/null 2>&1; then
  systemctl restart apache2
  echo "apache restarted" >&2
else
  echo "apache configtest failed" >&2
fi

Затем в incrontab используйте этот скрипт:

/etc/apache2/apache2.conf IN_MODIFY /usr/local/bin/restart-apache-if-valid

Убедитесь, что скрипт исполняемый и безопасен по правам доступа (root-only запись).

7 Тестирование, логирование и отладка

  • Логи incron обычно пишутся в /var/log/syslog (или journald). Поиск по слову incrond даст записи о запуске команд.
journalctl -u incrond
# или
grep incrond /var/log/syslog
  • Если команда не запускается, проверьте:

    • Есть ли права у пользователя на чтение/выполнение скрипта?
    • Корректно ли указан путь к интерпретатору в шебанге (#!)?
    • Не порождает ли команда дополнительные события в отслеживаемой директории (циклы)?
  • Для отладки записывайте вывод команд в отдельный лог-файл с указанием времени и переменных окружения. Пример: в скрипт добавьте

echo "
$(date) - event: $@/$# flags=$%" >> /var/log/incron-debug.log

8 Предупреждения и типичные ошибки

Важно:

  • Не изменяйте файлы в той же директории, которую вы мониторите, из вызываемой команды — это может вызвать цикл и перегрузить систему.
  • Incron не отслеживает рекурсивно поддиректории. Для рекурсии придётся добавить отдельное правило для каждой директории или писать watcher, который динамически регистрирует директории.
  • Ограничьте права доступа к /etc/incron.allow и скриптам, вызываемым incron.

Пример проблемы: вы отслеживаете /tmp и при каждом событии скрипт пишет лог в /tmp. Это создаст новые события и может привести к бесконечному циклу.

9 Чек-листы перед вводом в продакшн

Чек-лист для администратора (root):

  • Добавлен только нужный список пользователей в /etc/incron.allow.
  • Скрипты вызываемые через incron имеют строгие права (700 или 750) и принадлежат root.
  • Скрипты выполняют минимальную работу и следуют принципу idempotence (повторный запуск не ломает состояние).
  • Логирование настроено отдельно от отслеживаемой директории.
  • Используется проверка конфигурации сервисов перед перезапуском (например, apachectl configtest).
  • Добавлены ограничения на number of concurrent runs или применён systemd unit с конфигурацией Restart/StartLimit.

Чек-лист для SRE / DevOps:

  • Мониторинг инцидентов по incron (alerts при частых срабатываниях).
  • Ограничение частоты срабатываний (debounce) в скриптах или через lock-файлы.
  • Тестовые сценарии, проверяющие, что команда не создаёт новых событий.

10 План внедрения (мини-методология)

  1. В тестовом окружении добавьте incron и минимальные правила.
  2. Сделайте скрипты idempotent и безопасными.
  3. Настройте логирование в отдельную директорию вне отслеживаемых путей.
  4. Протестируйте сценарии ошибок (сломанные конфига).
  5. Постепенно перенесите правила в staging/production.
  6. Добавьте алерты при превышении частоты срабатываний.

11 Альтернативы и когда incron не подходит

Когда incron хорош:

  • Лёгкие триггеры на изменения небольших наборов файлов.
  • Автоматический перезапуск служб при изменении конфигурации.

Когда стоит искать альтернативы:

  • Нужно отслеживать рекурсивно большие деревья — inotify/incron может не справиться с количеством дескрипторов; лучше использовать специализированные демоны (fdnotify/entr) или периодические опросы с rsync/git hooks.
  • Высокая частота изменений (например, временные файлы) — лучше использовать debounce/aggregator, очередь задач или systemd path units.
  • Если требуется распределённое отслеживание файлов между машинами — используйте системu синхронизации/брокер событий.

12 Отладочный план/Runbook при проблемах

Если incron не запускает команды:

  1. Проверить статус демона:
systemctl status incrond
  1. Посмотреть журналы:
journalctl -u incrond -n 200
grep incrond /var/log/syslog
  1. Проверить права на /etc/incron.allow и скрипты.
  2. Запустить скрипт вручную от того же пользователя (например, от root) и посмотреть ошибки.
  3. Временно заменить команду в incrontab на echo в файл-лог, чтобы проверить, вызывается ли она.

13 Рекомендации по безопасности

  • Ограничьте список пользователей в /etc/incron.allow.
  • Не предоставляйте пользователям возможность создавать правила, которые выполняют произвольные команды от имени root.
  • По возможности запускайте сложные задачи от непривилегированных пользователей; если нужен root, используйте скрипт-обёртку с контролем.
  • Используйте SELinux/AppArmor профили для скриптов, если это актуально для вашей системы.

14 Критерии приёмки

  • Incron установлен и запущен.
  • Нужные пользователи добавлены в /etc/incron.allow.
  • Для каждого правила есть тестовый сценарий, подтверждающий корректность работы без возникновения циклов.
  • Логи событий доступны и индексируются системой мониторинга.
  • Скрипты, запускаемые incron, проходят проверку конфигурации перед перезапуском сервисов.

15 Полезные примеры и сниппеты (cheat sheet)

Быстрая проверка наличия прав для пользователя root:

grep -E "^root$" /etc/incron.allow || echo root >> /etc/incron.allow

Пример debounce-обёртки (чтобы не перезапускать Apache чаще, чем раз в 60 секунд):

#!/bin/bash
LOCKFILE=/var/lock/incron-apache.lock
if mkdir "$LOCKFILE" 2>/dev/null; then
  (sleep 60; rmdir "$LOCKFILE") &
  /usr/local/bin/restart-apache-if-valid
else
  echo "debounced"
fi

Сохраните как /usr/local/bin/restart-apache-debounced и используйте в incrontab.

16 Ссылки

重要: не забывайте тестировать все правила в контролируемой среде, прежде чем включать их в production.

Краткое резюме

Incron — удобный инструмент для связывания событий файловой системы с командами. Он полезен для автоматизации задач, но требует осторожности: контролируйте права доступа, избегайте записей в отслеживаемые директории из вызываемых команд, проверяйте конфигурации перед применением и добавляйте защитные механизмы (debounce, проверка configtest). Используйте чек-листы и runbook для безопасного внедрения.

Поделиться: 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 быстро