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

entr: отслеживание изменений файлов в Linux

6 min read Инструменты Linux Обновлено 20 Nov 2025
entr: отслеживание файлов в Linux
entr: отслеживание файлов в Linux

Эффект домино: файлы, запускающие команды

Краткие ссылки

  • The entr Command

  • Installing entr

  • A Simple Example

  • Practical Uses

  • Leveraging Git

  • Restarting Servers and Interpreters

  • Not Just for Programmers

Что делает entr

entr — это небольшая утилита для Unix-подобных систем. Она принимает список файлов на stdin и запускает указанную команду каждый раз, когда один из этих файлов меняется. Команда, которая запускается, может быть любая: встроенная команда оболочки, alias, функция оболочки или внешний скрипт.

Определение в одну строку: entr — наблюдатель за файлами, который запускает команды при изменениях.

Важно: entr не заменяет планировщики задач (cron) и не является системой слежения за версиями. Это инструмент для «живой» автоматизации во время разработки и администрирования.

Установка entr

На Ubuntu:

sudo apt-get install entr

На Fedora:

sudo dnf install entr

На Manjaro:

sudo pacman -Syu entr

Если в вашей системе пакет недоступен, можно собрать из исходников с официального репозитория проекта.

Простой пример

Создадим файл example.txt и настроим entr так, чтобы при изменении файла он запускал wc для подсчёта строк, слов и байтов.

touch example.txt
ls example.txt | entr wc /_

Команда ls example.txt | entr wc /_ в окне терминала

Пояснение: символ /_ в аргументе команды подменяется именем файла, вызвавшего срабатывание. Если передан набор файлов, /_ заменится именем последнего изменённого файла.

Для остановки entr нажмите q или Ctrl+C.

См. также: Что такое stdin, stdout и stderr в Linux?

Практические сценарии использования

Ниже — типичные сценарии и приёмы применения entr.

Пересборка проекта при изменении исходников

Запускаем make и, при успешной сборке, запускаем тесты:

ls | entr -s 'make && make test'

Флаг -s запускает команду в оболочке, установленной в переменной окружения SHELL. Это полезно, когда команда содержит последовательность команд или операторы оболочки (&&, ||, перенаправления и т.п.).

Чтобы наблюдать только за исходниками C и заголовками:

ls *.[ch] | entr -s 'make && make test'

Или вызвать ваш скрипт сборки:

ls *.[ch] | entr ./script.sh

Использование возможностей Git для фильтрации файлов

git ls-files выводит файлы, учитывая .gitignore. Это удобный способ получить список „интересных“ файлов проекта:

git ls-files | entr ./script.sh

Опции git ls-files полезны для тонкой настройки списка:

  • -c: cached (индекс)
  • -d: deleted
  • -m: modified
  • -o: untracked
git ls-files -cdmo --exclude-standard | entr 'make && make test'

Отслеживание появления новых файлов

По умолчанию предыдущая команда не поймает новый файл, пока он не появится в выводе git ls-files. Чтобы обработать создание новых файлов в каталоге, используйте опцию -d, которая заставляет entr следить за директориями и выходить при появлении нового файла. Тогда можно перезапустить entr в цикле, чтобы обнаружить обновлённый список файлов:

while true; do
  { git ls-files; git ls-files . --exclude-standard --others; } | entr -d ./script.sh
done

Этот приём перезапускает entr, когда в каталоге появляется новый файл, и новый файл попадёт в следующий проход.

Перезапуск интерпретаторов и серверов

Для интерпретируемых языков удобно останавливать и запускать интерпретатор при изменении файла. Опция -r (restart) останавливает предыдущий процесс и запускает новый.

ls hello_world.rb | entr -r ruby hello_world.rb

При каждом сохранении файла ruby-процесс будет перезапущен и выполнит обновлённую программу. Нажатие пробела (spacebar) заставит entr перезапустить команду вручную, даже если файл не менялся.

Когда использовать entr, а когда — нет

Important: entr хорош для быстрого цикла разработки и автоматизации простых задач. Он не подходит для критичных продуктивных рабочих нагрузок, где требуется надёжный долгоживущий менеджмент процессов, оркестрация или продвинутое логирование. Для таких случаев лучше смотреть на systemd path units, supervisord или Kubernetes.

Когда entr может не подойти:

  • Нужно отслеживать сотни тысяч файлов и высокая нагрузка на I/O — inotify-инструменты будут эффективнее с точки зрения ресурсов.
  • Требуется устойчивость и автоперезапуск в продакшене с учётом зависимостей — systemd/supervisord предпочтительнее.
  • Безопасность: запуск команд с правами, превосходящими привилегии файла-источника, может быть опасен.

Альтернативы и дополняющие инструменты

Если вам нужно более гибкое или низкоуровневое слежение, рассмотрите:

  • inotifywait / inotify-tools — низкоуровневый интерфейс inotify.
  • fswatch — мультиплатформенный аналог.
  • nodemon — для Node.js, автоматически перезапускает приложение.
  • entr — лёгкий и универсальный; сочетайте его с git и простыми скриптами.

Ментальная модель: entr = «слухач файлов» + «триггер команд», inotifywait = «тревожный детектор», systemd = «менеджер процессов для продакшена».

Безопасность и конфиденциальность

  • Не запускайте непроверенные скрипты через entr на серверах с важными данными.
  • Проверяйте права доступа и владельца файлов, которые запускают команды.
  • При автоматической обработке файлов, поступающих извне (FTP, rsync, curl), добавьте проверку типов и сигнатур, чтобы избежать выполнения вредоносного кода.
  • Лучше запускать обработчики под непривилегированным пользователем.

Шпаргалка (часто используемые команды)

  • Отслеживать один файл и запускать wc:
ls example.txt | entr wc /_
  • Отслеживать все .c и .h и запускать make:
ls *.[ch] | entr -s 'make && make test'
  • Использовать git для списка файлов:
git ls-files | entr ./script.sh
  • Обрабатывать появление новых файлов в каталоге:
while true; do
  { git ls-files; git ls-files . --exclude-standard --others; } | entr -d ./script.sh
done
  • Перезапуск интерпретатора Ruby при изменениях:
ls hello_world.rb | entr -r ruby hello_world.rb

Роль‑ориентированные контрольные списки

Разработчик:

  • Использовать entr локально для быстрой обратной связи.
  • Ограничить список файлов до исходников.
  • Локально логировать вывод сборки и тестов.

Системный администратор:

  • Не запускать непроверенные скрипты от имени root.
  • Установить мониторинг ресурсов при массовом использовании entr.
  • Подумать о более надёжных инструментах для продакшена.

DevOps-инженер:

  • Внедрять entr в CI для локальной разработки, но не в продакшен.
  • Документировать используемые команды и переменные окружения.

Примеры отказов и как их обходить

Сценарий: Вы запускаете entr с ls, но файлы не попадают в список из-за пробелов в именах.

Решение: Используйте нулевой разделитель (если возможен) или применяйте find и xargs с опцией -0, либо берите список из git, который корректно обрабатывает имена с пробелами:

# Пример с find и -print0
find . -name '*.[ch]' -print0 | xargs -0 ls | entr -s 'make'

Сценарий: entr не реагирует на новые файлы, пока вы не перезапустите.

Решение: Добавьте опцию -d и цикл, как показано выше, чтобы перезапускать entr при изменении содержимого каталогов.

Пример рабочего процесса и критерии приёмки

Мини‑методика внедрения entr в репозиторий:

  1. Добавьте в README инструкции по установке и запуску entr для локальной разработки.
  2. Создайте скрипт script.sh, который выполняет сборку и тесты и возвращает ненулевой код при ошибках.
  3. Настройте команды git ls-files | entr -d ./script.sh в Makefile или как отдельный target.

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

  • Скрипт запускается через entr и корректно реагирует на изменения исходников.
  • При добавлении нового файла, скрипт обнаруживается и запускается автоматически.
  • При ошибке сборки возвращается ненулевой код и вывод сохраняется в логах.

Примеры команд в реальных задачах

  • Автоматическое архивирование входящих файлов в директории:
ls /var/incoming | entr -s 'gzip /_ && mv /_.gz /var/archive/'
  • Просмотр логов и поиск критических ошибок при появлении новых лог‑файлов:
ls /var/log/myapp/* | entr -s 'grep -H "ERROR" /_ || true'

Note: в скриптах используйте явные пути и проверки, чтобы избежать побочных эффектов.

Визуальная схема принятия решения

flowchart TD
  A[Есть ли требование к автоматическому запуску при изменениях?] -->|Да| B{Это dev или prod?}
  B -->|Dev| C[Использовать entr]
  B -->|Prod| D[Использовать systemd/supervisor/Kubernetes]
  C --> E{Нужно отслеживать появление новых файлов?}
  E -->|Да| F[entr -d в цикле + git ls-files --others]
  E -->|Нет| G[Статический список файлов через git ls-files]

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

  • entr — простой и полезный инструмент для автоматизации действий при изменениях файлов.
  • Используйте git ls-files, чтобы исключить ненужные файлы.
  • Для появления новых файлов применяйте опцию -d и перезапуск в цикле.
  • В продакшене выбирайте более надёжные менеджеры процессов.

Итог

entr отлично подходит для локальной разработки, автоматизации сборок, тестов и перезапуска интерпретаторов. Он лёгок в установке и прост в использовании. При интеграции в рабочие процессы соблюдайте безопасность: проверяйте, кто и какие файлы добавляет, и избегайте выполнения непроверённых команд.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Как изменить яркость экрана на iPhone или iPad
Гаджеты

Как изменить яркость экрана на iPhone или iPad

Airbnb Style Guide и ESLint: настройка для JavaScript
JavaScript

Airbnb Style Guide и ESLint: настройка для JavaScript

Валидация данных в Google Sheets
Электронные таблицы

Валидация данных в Google Sheets

Письма попадают в корзину Gmail — как исправить
Email

Письма попадают в корзину Gmail — как исправить

Удалить историю просмотров Prime Video
Руководство

Удалить историю просмотров Prime Video

Сделать копию DVD на Linux с Handbrake
Linux

Сделать копию DVD на Linux с Handbrake