【问题标题】:Inotify monitor sub-directories with certain depth?Inotify 具有一定深度的监控子目录?
【发布时间】:2023-03-26 08:35:01
【问题描述】:

是否可以通过 inotify 将新创建的子目录中的文件监控到一定级别?

假设有一个结构:

/home/user1/data
/home/user2/data
...

定期添加新用户。

我们只想监控“data”目录中的数据,但不想监控新创建的子目录中的数据,例如如果用户创建“/home/user3/data/test_uploads”,则不应该进行处理。

如果我们使用以下语法的 inotifywait,它将只检查现有目录:

inotifywait -m -e close_write /home/*/data/

如果我们在 /home 中创建新用户,它不会被处理,因为 inotify 只扫描现有目录。

有什么方法可以将新添加的目录监控到一定级别,但不使用"-r"选项,因为它会监控所有子目录?

提前致谢!

【问题讨论】:

标签: linux inotify


【解决方案1】:

inotifywait--exclude 选项,但不幸的是它没有--include 选项并且它不支持扩展的POSIX 正则表达式,因此不能只包含文件不匹配 给定模式。详情见this answer

其他选项:

  • 您可以只输出inotifywaitgrep,但这样就无法避免监控所有不必要的子文件的开销。

  • 您可以使用已修补的inotifywait--include 选项,如上面链接的答案中所述。

  • 您可以直接使用inotify API 编写您自己的程序,这样您就可以控制监控哪些文件以及排除哪些文件。也有各种脚本语言的绑定,包括 Python。

  • 您可以使用各种 inotify 包装器,例如watchdog Python 模块。


这是一个使用 watchdog Python 模块和来自其仓库的 watchdemo.py 脚本的示例。

启动监视器:

$ python2 watchdemo.py shell-command \
    --recursive \
    --pattern='/home/*/data/*' \
    --ignore-pattern='/home/*/data/*/*' \
    --ignore-directories \
    --command='echo "${watch_event_type} ${watch_src_path}"' \
    /home

创建文件和目录:

$ mkdir -p /home/user/data
$ touch /home/user/foo
$ touch /home/user/data/bar
$ mkdir /home/user/data/baz
$ touch /home/user/data/baz/qux

监视器输出将是:

created /home/user/data/bar
modified /home/user/data/bar

请注意,/home/user/foo/home/user/data/baz/qux 不匹配。

如果需要按类型过滤事件:

  • 如果您使用的是watchdemo.py,请检查 shell 命令中的类型:

    ... \
    --command='[ "${watch_event_type}" = created ] && echo "${watch_src_path}"'
    
  • 如果您直接使用watchdog Python 模块,请从FileSystemEventHandler 派生自定义事件处理程序并覆盖所需的方法,例如on_created.

【讨论】:

  • 谢谢你,真的很有用!这种方法有两个问题:1)是否有可能以某种方式只监视“创建”事件,而没有“修改”?目标是在创建文件时只通知一次 2) 如果我为 --pattern='/home/*/data/*' 而不是 --pattern='./*/data/*' 放置完整路径,它不起作用,不知道为什么?提前致谢!
  • 对于 1),请参阅更新后的答案。对于 2),尝试使用绝对路径的 watchdemo 的 --directory 选项
  • 谢谢!第一个选项工作得很好,它正在显示“创建”事件。但是第二个目录不起作用,我尝试使用 --directory 并且它无法识别标志,看起来它不存在。我尝试使用选项“directories /home/user”,但出现错误“OSError:Path is not a directory”。目录指令似乎有问题
  • @Igor 我的错。目录作为位置参数传递给watchdemo,没有选项。查看更新的答案。
  • 嗨@gavv,看起来这种方法存在问题,因为在文件实际关闭之前文件被报告为“已创建”。结果,它正在处理实际上没有完全写入的文件。有什么办法只有在文件完全写入和关闭后才能处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 2014-10-17
  • 2011-11-25
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
相关资源
最近更新 更多