有关实现pyinotify实例以监控目录的问题

时间:2011-12-19 13:57:20

标签: python linux events loops inotify

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

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

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

3)与#2类似,如果在我的事件处理器功能中创建文件会发生什么? pyinotify会将其缓存在队列中并在'循环'再次启动时处理它,还是会丢失此事件?

1 个答案:

答案 0 :(得分:2)

  • 是否需要暂停(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开始使用source code

    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中的评论。