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

标签 python linux events loops inotify

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

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

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

3) 与 #2 类似,如果在我的事件处理器函数中创建文件会怎样? pyinotify 会在它的队列中缓存它并在“循环”再次开始时处理它,还是我会丢失这个事件?

最佳答案

  • 是否需要有一个 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 中的评论.

关于python - 关于实现pyinotify实例监控目录的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562376/

相关文章:

python - 如何在 Spyder 中查看#TODO-s 列表?

.net - 为什么事件在 .NET 中没有返回类型?

javascript - jQuery - 为什么文本字段变空?

python - 如何从字符串中找到多词字符串,并在Python中对其进行标记?

python - 格式化字符串未使用的命名参数

python - 如何使 Python 脚本像 Linux 中的服务或守护程序一样运行

c++ - 如何检测 Wine 是从 Linux 运行还是从 C++ 的 mac OS 环境运行?

powershell - 如何在 powershell 中发送鼠标点击?

python - 将列表字典打印为网格布局

linux - 是否可以允许用户访问目录而不使他成为所有者?