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
.
是否可以使用 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
.