2013-09-13 2 views
3

Я испытываю такую ​​ситуацию:Преждевременное уведомление IN_CLOSE_WRITE с pyinotify

  • pyinotify отслеживает файл IN_CLOSE_WRITE событий
  • Я что-то изменить в файле и сохранить его
  • событие инициируется
  • Я прочитал файл и вижу, что он не имеет никаких изменений.

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

Итак, кажется, что добавление time.sleep(1) или задержка исполнения каким-то другим способом делает трюк. В противном случае я получаю преждевременное событие IN_CLOSE_WRITE.

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

использование IN_CLOSE_WRITE, потому что, если излучаемый на все изменения на соответствующем файле безопасно написано в файле

Я подал отчет об ошибке о формулировке в FAQ, но тем временем я хотел бы получить дополнительную информацию по этому вопросу. Это должно произойти? Каковы «морально правильные» способы его решения?

Все это происходит на Linux Mint 15 x64.

ответ

3

Оказывается, что такое поведение not an anomaly:

Как я уже сказал, я думаю, что миссия Inotify (и, следовательно, как сообщалось by Pyinotify) - сигнализировать вам, когда файл закрыт (точнее, когда он закрыт его файловым дескриптором), но, очевидно, ядро ​​использует буферы, и поэтому данные файла не могут быть записаны на диск немедленно. Для получения дополнительной информации см. Man (2) функции close():

Успешное закрытие не гарантирует, что данные были успешно сохранены на диск, так как ядро ​​откладывает записи. Нередко файловая система очищает буферы, когда поток закрыт. Если вам нужно убедиться, что данные физически сохранены, используйте fsync (2). (Это будет зависеть от диска аппаратного обеспечения в этой точке.)

Нижняя линия вы не можете полагаться на IN_CLOSE_WRITE, чтобы быть уверенным, что ваши данные Закончился быть написано на диске.

Другими словами, это не преждевременное уведомление, оно приходит в нужное время; но основные механизмы ОС могут продолжать делать что-то с этим файлом.

0

документация говорит «был закрыт»:

$ man 7 inotify|grep IN_CLOSE_WRITE 
      IN_CLOSE_WRITE File opened for writing was closed (*).