Inotify 监控一定深度的子目录?

Inotify monitor sub-directories with certain depth?

是否可以使用 inotify 监控新创建的子目录中的文件达到一定级别?

假设有一个结构:

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

定期添加新用户。

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

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

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

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

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

提前致谢!

inotifywait--exclude选项,可惜没有--include选项,也不支持扩展的POSIX正则表达式,所以不可能仅包含 不匹配 给定模式的文件。请参阅 this answer 中的详细信息。

其他选项:

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

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

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

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

  • 模块

这是一个使用 watchdog Python 模块和来自他们的 repo 的 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.