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 incrontab4 Синтаксис 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.log8 Предупреждения и типичные ошибки
Важно:
- Не изменяйте файлы в той же директории, которую вы мониторите, из вызываемой команды — это может вызвать цикл и перегрузить систему.
- 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 План внедрения (мини-методология)
- В тестовом окружении добавьте incron и минимальные правила.
- Сделайте скрипты idempotent и безопасными.
- Настройте логирование в отдельную директорию вне отслеживаемых путей.
- Протестируйте сценарии ошибок (сломанные конфига).
- Постепенно перенесите правила в staging/production.
- Добавьте алерты при превышении частоты срабатываний.
11 Альтернативы и когда incron не подходит
Когда incron хорош:
- Лёгкие триггеры на изменения небольших наборов файлов.
- Автоматический перезапуск служб при изменении конфигурации.
Когда стоит искать альтернативы:
- Нужно отслеживать рекурсивно большие деревья — inotify/incron может не справиться с количеством дескрипторов; лучше использовать специализированные демоны (fdnotify/entr) или периодические опросы с rsync/git hooks.
- Высокая частота изменений (например, временные файлы) — лучше использовать debounce/aggregator, очередь задач или systemd path units.
- Если требуется распределённое отслеживание файлов между машинами — используйте системu синхронизации/брокер событий.
12 Отладочный план/Runbook при проблемах
Если incron не запускает команды:
- Проверить статус демона:
systemctl status incrond- Посмотреть журналы:
journalctl -u incrond -n 200
grep incrond /var/log/syslog- Проверить права на /etc/incron.allow и скрипты.
- Запустить скрипт вручную от того же пользователя (например, от root) и посмотреть ошибки.
- Временно заменить команду в 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 для безопасного внедрения.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента