2016-01-12 3 views
2

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

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

  1. С atomic_save набора для «ложного» файл, как представляется, всегда пусто в событии onchange и
  2. С atomic_save «true» иногда пуст, а иногда и частично написан.

Мы имели эту проблему, прежде чем с PhpStorm, но после перехода на «использовать„безопасной записи“(сохранить изменения в временный файл)» - так же настройки, как atomic_save в возвышенном, что также объясняет, почему мы попробовал atom_save в sublime -, событие onchange было вызвано правильно после того, как все было написано.

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

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

ответ

2

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

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

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

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

+1

Спасибо! Я не видел эту настройку. Ну, у меня установлен последний chokidar, но почему-то этот параметр не имеет значения. Даже с объектом awaitWriteFinish и значением стабильностиThreshold, установленным в 10000, пусть событие onchange запускается мгновенно (а не через 10 секунд). Но я просто попробовал другую настройку самостоятельно, «usePolling: true», и она работает тогда. Ну, это, похоже, не очень перформативно, но, по крайней мере, это работает. – Ryo

+0

@Ryo Я рад, что вы заработали. Если этот ответ [обратился к вашей проблеме] (http://stackoverflow.com/help/someone-answers), пожалуйста, рассмотрите [принять его] (http://meta.stackexchange.com/questions/5234/how-does-accepting -an-answer-work), нажав на галочку/галочку слева от ответа, повернув ее зеленым. Это означает, что вопрос был удовлетворен вашим удовлетворением, а также награды [репутации] (http://stackoverflow.com/help/whats-reputation) как вам, так и тому, кто ответил. – MattDMo