是否可以使用inotify监控新创建的子目录中的文件达到一定水平?
我们假设有一个结构:
/home/user1/data
/home/user2/data
...
定期添加新用户。
我们只想监视“data”目录中的数据,但不想监视新创建的子目录中的数据,例如,如果用户创建“/ home / user3 / data / test_uploads”,它不应该被处理。
如果我们使用带有以下语法的inotifywait,它将仅检查现有目录:
inotifywait -m -e close_write /home/*/data/
如果我们在/ home中创建新用户,则不会对其进行处理,因为inotify仅扫描现有目录。
有没有办法监控新添加的目录达到某个级别,但是没有使用"-r"
选项,因为它会监控所有子目录?
提前致谢!
答案 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
。