inotifywait –exclude не срабатывает, когда имеется хотя бы один файл, не исключенный из наблюдения.

Вопрос или проблема

Я использую эту команду для наблюдения за каталогом:

inotifywait -r -e modify,create,delete --exclude ".*(\.(git|idea)|(.*(___jb_tmp___|___jb_old___)))" my-dir

Однако она не работает так, как я хочу. То, что мне нужно, — это чтобы она НЕ срабатывала, если каждый файл, который был изменен, исключен. Если изменяется хотя бы один файл, который НЕ исключен, я хочу, чтобы inotifywait сработала.

Мой общий план заключается в том, чтобы отправлять код на удаленный сервер, когда изменяется файл Python или что-то еще, имеющее значение. Я не хочу отправлять код, когда изменяются только метафайлы из моей IDE (PyCharm) или файлы git.

Есть ли способ это сделать?

Сейчас inotifywait не срабатывает, когда я изменяю файл Python в PyCharm, так как есть некоторые файлы, которые изменяются и заканчиваются на _jb_tmp_. Однако, если я изменяю файл Python вручную, это работает (например, в nano или vim).

Как указано в комментариях к моему вопросу, я выяснил, что проблема вызвана не inotifywait, а PyCharm. Оказалось, что в PyCharm есть опция под названием “безопасная запись”, которая указывает IDE сначала записывать изменения во временные файлы, и если это удается, она удаляет оригинальный файл и переименовывает временный файл в имя оригинального файла.

Именно поэтому inotifywait видит только такие события:

$ inotifywait -r -m -e modify,create,delete my-dir

my-dir/ CREATE main.py___jb_tmp___ 
my-dir/ MODIFY main.py___jb_tmp___ 
my-dir/ DELETE main.py___jb_old___ 
my-dir/.idea/ CREATE workspace.xml___jb_tmp___ 
my-dir/.idea/ MODIFY workspace.xml___jb_tmp___ 
my-dir/.idea/ DELETE workspace.xml___jb_old___ 
my-dir/.git/ CREATE index.lock 
my-dir/.git/ DELETE index.lock

Поэтому я отключил безопасную запись в PyCharm и теперь использую эту команду:

inotifywait -r -e modify,create,delete --exclude ".*(\.git|\.idea)" my-dir

Это делает именно то, что я хочу. События, которые я вижу от inotifywait, такие:

my-dir/ MODIFY main.py

.

Ответ или решение

Теория

inotifywait — это утилита командной строки, которая позволяет мониторить файловую систему на предмет изменений в реальном времени. Она может отслеживать события, такие как создание, модификация или удаление файлов в указанных директориях. Благодаря этому inotifywait очень полезен для автоматизации задач разработки и администрирования систем, например, авто-запуск тестов при изменении исходного кода или автоматическая синхронизация файлов на удалённый сервер.

Вопрос касается использования inotifywait в контексте исключений: пользователь хочет, чтобы команда не срабатывала, только если все изменённые файлы попадают под исключение. Это довольно распространённая задача, особенно в сценариях, где нужно игнорировать изменения определённого класса файлов, таких как временные файлы от IDE или файловые метаданные.

Пример

Вы привели пример использования команды inotifywait с флагами -r -e modify,create,delete и параметром --exclude, который позволяет игнорировать файлы, соответствующие определённым регулярным выражениям. Однако вы заметили, что команда не выдавала событий, когда изменения касались и файлов, соответствующих исключению, и тех, которые не относились к исключению. После исследования выяснилось, что PyCharm использует механизм "безопасной записи", что приводит к созданию временных файлов, которые детектируются inotifywait.

Эти события выглядели следующим образом:

my-dir/ CREATE main.py___jb_tmp___ 
my-dir/ MODIFY main.py___jb_tmp___ 
my-dir/ DELETE main.py___jb_old___ 

Хотя это может казаться сложностью, это дало ценный урок о том, как инструменты разработки могут влиять на работу системных утилит.

Применение

После отключения "безопасной записи" в PyCharm вы изменили команду inotifywait, удалив из неё сложные регулярные выражения исключения и вместо этого используете более простую форму: --exclude ".*(\.git|\.idea)" my-dir. Это позволило избежать проблемы с нежелательными временными файлами. Теперь событие срабатывает корректно, даже если только один файл из всех изменённых не подпадает под исключение.

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

Дополнительно, для решения подобных проблем, стоит рассмотреть следующее:

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

  2. Тестирование в изолированной среде: Перед внедрением изменений в рабочую директиву, тестируйте их в изолированных условиях. Это позволит заметить неочевидные зависимости.

  3. Использование логирования: Расширьте использование логов, чтобы отслеживать работу системы и быстро выявлять источники проблем.

  4. Сложные скрипты для анализа: Используйте языки программирования, такие как Python или Bash, для написания дополнительных скриптов, которые могут более тонко контролировать, какие изменения учитывать, а какие — игнорировать.

Заключение

Конфликт между inotifywait и PyCharm иллюстрирует важность понимания того, как работают используемые вами инструменты, и их влияние друг на друга. Путём отключения "безопасной записи" и упрощения регулярного выражения исключения, вы смогли достичь желаемого поведения inotifywait.

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

Оцените материал
Добавить комментарий

Капча загружается...