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

1 投票
1 回答
2233 浏览
提问于 2025-04-17 08:38

我有一些关于pyinotify的基本问题,找不到答案。

1) 如果我想持续监控一个文件夹(并处理事件),是不是必须要有一个while(True)的循环?还是说这个持续的事件“循环”是由notify watch来处理的,当我移除监控时就结束了?

2) 当我开启inotify实例时,如果文件已经存在,会发生什么?我最开始只想监控文件的创建(IN_CREATE),但这样就无法处理那些已经存在的文件。

3) 和第二个问题类似,如果在我处理事件的函数中创建了一个文件,会发生什么?pyinotify会把这个事件放在队列里等“循环”再次开始时处理,还是我会错过这个事件?

1 个回答

2
  • 是否有必要使用 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 的回答 中的评论。

撰写回答