chokidar: событие onchange для файла, возможно, инициируется для быстрого


Мы следим за изменениями файлов, используя chokidar с nodejs на сервере Ubuntu. Это работает довольно хорошо, но иногда я думаю, что у нас есть проблема с тем, как файл сохраняется при изменении: в chokidar запускается событие "onchange", но когда мы читаем файл в обратном вызове, он пуст или (редко) не записан полностью. Мы не знаем, является ли это проблемой, вызванной текстовым редактором, пишущим файл, операционной системой на клиентском компьютере, операционной системой или файловой системой (ext4) на сервере или, если это какой-то жук в чокидаре.

Эта проблема пустого файла теперь происходит почти каждый раз, когда изменения файла сделаны с одного компьютера (mac, последняя версия osx), где используется sublime 3. В sublime мы попробовали настройку " atomic_save "(создает временные файлы, а затем перезаписывает исходный файл), но это не решило нашу проблему:

  1. с atomic_save , установленным в "false", файл кажется всегда пустым в событии onchange и
  2. с atomic_save "true" иногда пустое, а иногда частично записанное.

У нас была эта проблема раньше с phpstorm, но после переключения на ' use "safe write" (save changes to a temporary file first) ' - таким образом, та же настройка, что и atomic_save в sublime, поэтому мы также попробовали atomic_save в sublime -, событие onchange было правильно запущено после завершения записи.

Итак, наш вопрос заключается в том, есть ли способ, чтобы" onchange " сработал, когда файл полностью написан как-то (в чокидаре, в ОС, в sublime)? Или мы должны проверить размер файла в событии "onchange", пока он не изменится в течение некоторого времени (не очень приятно)? Или наша проблема может возникнуть из-за чего-то другого?

Мы будем признательны за любые подсказки! Заранее спасибо!

1 2

1 ответ:

Просматривая раздел performance README chokidar, я нашел следующее:

awaitWriteFinish (по умолчанию: false). По умолчанию событие add запускается, когда файл впервые появляется на диске, до того, как весь файл был записан. Кроме того, в некоторых случаях некоторые события change будут выдаваться во время записи файла. В некоторых случаях, особенно при поиске больших файлов, необходимо дождаться завершения операции записи, прежде чем отвечать на запрос. создание или модификация файлов. Установка awaitWriteFinish в true (или значение true) будет опрашивать размер файла, удерживая его события add и change, пока размер не изменится в течение настраиваемого периода времени. Соответствующая настройка длительности сильно зависит от операционной системы и оборудования. Для точного обнаружения этот параметр должен быть относительно высоким, что делает просмотр файлов намного менее отзывчивым. используйте с осторожностью .

  • options.awaitWriteFinish можно установить к объекту для того чтобы отрегулировать время параметры:
    • awaitWriteFinish.stabilityThreshold (по умолчанию: 2000). Количество времени в миллисекундах, в течение которого размер файла остается постоянным, прежде чем произойдет его событие.
    • awaitWriteFinish.pollInterval (по умолчанию: 100). Интервал опроса размера файла.

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