вопросы по реализации экземпляра pyinotify для мониторинга каталога - PullRequest
1 голос
/ 19 декабря 2011

У меня есть несколько основных вопросов о пиинофикации, которые я не могу найти ответы на другие вопросы.

1) Для непрерывного монитора каталогов (и процессора событий) необходим ли цикл while (True) или непрерывный цикл обработки события обрабатывается уведомлением и завершается, когда я удаляю часы?

2) Что произойдет, если файлы уже существуют, когда экземпляр inotify «включен»?Первоначально я просто хочу отслеживать IN_CREATE, но он не будет обрабатывать уже существующие файлы.

3) Как и в случае # 2, что произойдет, если файл будет создан, пока я выполняю функцию обработчика событий?Будет ли pyinotify кэшировать его в своей очереди и обрабатывать при повторном запуске цикла, или я потеряю это событие?

1 Ответ

2 голосов
/ 19 декабря 2011
  • необходимо ли иметь цикл while (True)

Вам понадобится while-loop, но его можно неявно настроить, вызвавnotifier.loop метод:

    wm = pyinotify.WatchManager()
    mask = pyinotify.IN_CREATE
    notifier = pyinotify.Notifier(wm, MyProcessEvent(path))
    wdd = wm.add_watch(path, mask, rec=True, auto_add=True)
    notifier.loop()

Если вы хотите настроить while-loop самостоятельно, вы можете начать с этого исходного кода из notifier.loop:

    while 1:
        try:
            notifier.process_events()
            # check_events is blocking
            if notifier.check_events():
                notifier.read_events()
        except KeyboardInterrupt:
            # Stop monitoring if sigint is caught (Control-C).
            break
    notifier.stop()

Чтобы удалить наблюдение за определенным файлом или каталогом, позвоните по номеру wm.rm_watch.

  • Что произойдет, если файлы уже существуют, когда экземпляр inotify 'повернут-on '?

    Событие не генерируется до вызова wm.add_watch.

  • что произойдет, если файл будет создан, пока яв моей функции процессора событий?

    События помещаются в очередь в буфере размером /proc/sys/fs/inotify/max_queued_events.Например, в моей системе это число равно

    % cat /proc/sys/fs/inotify/max_queued_events
    16384
    

    Если файловая система генерирует достаточно событий, чтобы заполнить буфер во время обработки предыдущего события, тогда вы получите событие IN_Q_OVERFLOW.

    См. Комментарий в ответ Блюча .

...