关于实现 pyinotify 实例来监控目录的问题

Posted

技术标签:

【中文标题】关于实现 pyinotify 实例来监控目录的问题【英文标题】:questions about implementing pyinotify instance to monitor directory 【发布时间】:2011-12-19 13:57:19 【问题描述】:

我有一些关于 pyinotify 的基本问题,我似乎无法在其他地方找到答案。

1) 对于连续目录监视器(和事件处理器),是否需要有一个 while(True) 循环,或者通知手表处理连续事件“循环”并在我移除手表时结束?

2) 如果在 inotify 实例“打开”时文件已经存在,会发生什么?最初我只想监视 IN_CREATE 但这不会处理预先存在的文件。

3) 与 #2 类似,如果在我的事件处理器函数中创建文件会发生什么? pyinotify 会将其缓存在其队列中并在“循环”再次开始时对其进行处理,还是会丢失此事件?

【问题讨论】:

【参考方案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,可以从source code 开始,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's answer中的评论。

【讨论】:

所以我唯一需要考虑 pyinotify 找不到的文件是在程序启动并且目录(可能)已经有文件时。我将需要一个目录迭代器函数来手动处理这些,然后引入 pyinotify 实例.... @unutbu - 或者,我发现我可以使用 pyinotify 实现 asyncore.loop() 来创建无限 while 循环,文档在这里找到:github.com/seb-m/pyinotify/blob/master/python2/examples/… 哦!我不知道那件事。感谢分享。 notifierpyinotify.Notifier 的实例有一个方法loop 负责循环,因此您不必编写while True: …。见the example here.

以上是关于关于实现 pyinotify 实例来监控目录的问题的主要内容,如果未能解决你的问题,请参考以下文章

利用pyinotify监控文件内容,像tailf命令但比它更强

使用 pyinotify 在目录中创建假脱机的最佳方法是啥?

Python日志监控系统处理日志(pyinotify)

出现在目录中的文件比我处理它们的速度更快(pyinotify)

python中文件变化监控-watchdog

pyinotify:处理 IN_MODIFY 触发器