Когда служба отслеживания файлов на Mac пропускает изменения, сначала определите, доходит ли изменение до отслеживаемой папки, видит ли приложение события файловой системы и фильтрует ли оно их или не может обработать. Воспроизведите один пропуск изменения на небольшом известном файле, затем сравните этот результат с файлом в крупном проекте. Такая последовательность помогает отделить конфигурацию проекта от доставки событий и их обработки приложением.

1. Проверьте точный путь и изменение

В затронутом приложении проверьте, какая папка открыта в качестве рабочей области (workspace), и убедитесь, что отредактированный файл находится внутри этой папки. Файл может отображаться в редакторе, находясь за пределами отслеживаемого корня; символические ссылки также могут вести себя иначе, чем обычные вложенные папки. Например, в документации к VS Code указано, что его наблюдатель (watcher) для macOS использует FSEvents, символические ссылки не отслеживаются автоматически, а настройки исключений могут пропускать пути. Эти детали относятся именно к VS Code, а не ко всем приложениям Mac, поэтому проверьте аналогичные настройки рабочей области и исключений в вашем инструменте. VS Code: File Watcher Issues

Сохраните простое изменение в файле непосредственно внутри проекта, затем проверьте, реагирует ли приложение. Если сбой происходит только со сгенерированным, игнорируемым, связанным ссылкой или глубоко вложенным путем, изучите включение этого пути и его связь с корнем рабочей области, прежде чем считать это общесистемной проблемой macOS. Если проект находится на подключенном сетевом диске или использует стороннюю файловую систему, протестируйте копию на локальном диске Mac. VS Code предупреждает, что такие файловые системы не гарантируют генерацию событий; это повод для сравнения сред, а не доказательство того, что сбоит каждый подобный том.

2. Проверьте, получало ли приложение события

Уведомления файловой системы не гарантируют получение ровно одного обратного вызова (callback) на каждое отдельное изменение. В документации Apple по FSEvents указано, что события могут объединяться (coalesced); когда установлен флаг MustScanSubDirs, клиент должен рекурсивно выполнить повторное сканирование указанного каталога. Флаги отброшенных событий (dropped-event flags) указывают на проблемы с буферизацией и требуют полного сканирования отслеживаемых каталогов. Это означает, что корректно работающая служба отслеживания должна сверять текущее содержимое каталога, а не полагаться исключительно на непрерывную последовательность уведомлений. Apple: Using the File System Events API, Apple: FSEventStreamEventFlags

Поищите журналы или диагностику службы отслеживания в приложении, пропускающем изменения. В документации к VS Code описано, как включить подробное журналирование отслеживания файлов и изучить соответствующий вывод журнала. Другие приложения могут предоставлять иные средства диагностики или не иметь их вовсе. Если журнал сообщает об отброшенных событиях, исключениях, устаревшем корне (stale root) или ошибке службы отслеживания, сохраните это сообщение и следуйте инструкциям по восстановлению самого приложения; перезапуск службы отслеживания или приложения может послужить полезным контролируемым сравнением, но сам по себе не выявляет первопричину.

3. Используйте fs_usage для проверки активности файловой системы

macOS включает в себя утилиту fs_usage, которая отображает текущую активность системных вызовов, связанных с файловой системой. Она может помочь установить, обращается ли соответствующее приложение к файлам во время воспроизведения проблемы, но она не является средством просмотра событий FSEvents и не может служить доказательством того, что служба отслеживания получила или обработала уведомление. Apple отмечает, что к утилите применяются правила контроля доступа и могут потребоваться права root. Apple: Examining File-System Usage

В Терминале воспроизведите проблему, наблюдая за указанным приложением. Замените YourApp на фактическое имя его процесса (например, имя процесса приложения может отличаться от его отображаемого имени):

sudo fs_usage -w YourApp

Остановите отображение в реальном времени с помощью Control-C после короткого воспроизведения. Вывод может быть перегружен, поэтому сосредоточьтесь на времени внесения изменений и соответствующих путях. Если имя процесса неизвестно точно, обратитесь к документации приложения или к «Мониторингу системы» (Activity Monitor); не полагайтесь на фильтрацию по предполагаемому имени — так можно упустить нужный процесс. fs_usage — это диагностическое средство для отслеживания файловой активности, а не команда для сброса или восстановления службы отслеживания.

4. Сравните масштаб и условия доступа

Повторите то же изменение в небольшой локальной тестовой папке, которую приложение может отслеживать. Если там все работает, а на крупном проекте дает сбой, сравните специфичные для проекта исключения, символические ссылки, сгенерированные каталоги, а также любые удаленные пути или пути, управляемые сторонними провайдерами. Большие деревья каталогов создают больше нагрузки как для обработки событий, так и для повторного сканирования; рекомендации Apple ясно дают понять, что уведомления могут требовать рекурсивного сканирования, тогда как приложение само решает, как справляться с этой работой. Сама по себе корреляция с размером не доказывает достижение предела очереди событий операционной системы.

Проверьте, имеет ли затронутое приложение доступ к расположению проекта. Элементы управления конфиденциальностью macOS и правила App Sandbox могут ограничивать доступ к папкам, а в документации Apple указано, что для доступа к защищенным расположениям может потребоваться разрешение пользователя в «Системных настройках». Проверьте статус разрешений приложения в разделе Системные настройки > Конфиденциальность и безопасность и предоставьте только тот доступ, который необходим для выполнения задачи. Проблема с разрешениями может препятствовать полезному доступу к файлам, даже если путь отображается в приложении. Apple: Accessing Files from the macOS App Sandbox

5. Выберите следующий шаг на основе полученных данных

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

Источники