вопросы о реализации экземпляра pyinotify для мониторинга каталога

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

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

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

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


person sadmicrowave    schedule 19.12.2011    source источник


Ответы (1)


  • нужен ли цикл 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 «включен»?

    Перед вызовом wm.add_watch не генерируется никаких событий.

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

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

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

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

    См. комментарий в ответе blucz.

person unutbu    schedule 19.12.2011
comment
поэтому единственный раз, когда мне нужно учитывать файлы, которые pyinotify не найдет, - это когда программа запускается, а в каталоге (потенциально) уже есть файлы. Мне понадобится функция итератора каталога, чтобы вручную обрабатывать их, а затем ввести в экземпляр pyinotify.... - person sadmicrowave; 19.12.2011
comment
@unutbu - в качестве альтернативы я обнаружил, что могу реализовать asyncore.loop() с pyinotify для создания бесконечного цикла while, документы можно найти здесь: github.com/seb-m/pyinotify/blob/master/python2/examples/ - person sadmicrowave; 27.12.2011
comment
Ой! Я не знал об этом. Спасибо, что поделился. - person unutbu; 27.12.2011
comment
notifier, у экземпляра pyinotify.Notifier есть метод loop, который заботится о цикле, поэтому вам не нужно писать while True: …. См. пример здесь. - person dmmfll; 25.01.2016