Inotify监视器子目录具有一定的深度?

时间:2016-07-12 17:25:05

标签: linux inotify

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

我们假设有一个结构:

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

定期添加新用户。

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

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

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

如果我们在/ home中创建新用户,则不会对其进行处理,因为inotify仅扫描现有目录。

有没有办法监控新添加的目录达到某个级别,但是没有使用"-r"选项,因为它会监控所有子目录?

提前致谢!

1 个答案:

答案 0 :(得分:2)

inotifywait--exclude选项,但遗憾的是它没有--include选项,并且它不支持扩展的POSIX正则表达式,因此不能仅包含文件不匹配给定模式。请参阅this answer中的详细信息。

其他选择:

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

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

  • 您可以直接使用inotify API编写自己的程序,以便控制要监控的文件和要排除的内容。还有各种脚本语言的绑定,包括Python。

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

以下是使用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