Inotifywait 用于大目录
Posted
技术标签:
【中文标题】Inotifywait 用于大目录【英文标题】:Inotifywait for large directories 【发布时间】:2011-11-11 19:30:39 【问题描述】:在 inotifywait 的 man 更改中声明如下
-r, --recursive 监视作为参数传递的任何目录的所有子目录。手表将递归设置为无限 深度。不遍历符号链接。新创建的 子目录也将被监视。
警告:如果您在观看根目录时使用此选项 一棵大树,可能需要很长时间,直到所有 inotify 手表 已建立,此时将不会收到事件。 此外,由于每个子目录都会建立一个 inotify watch,它 是可能的,最大金额 将达到每个用户的 inotify 手表数量。默认最大值为 8192;它可以通过写入来增加 /proc/sys/fs/inotify/max_user_watches。
我认为这意味着每次调用 inotifywait
时,大型目录都会有延迟。因此,像这样使用监控功能不断监控一个大目录
inotifywait -m /home/user/Documents
比手动遍历目录更有效(来自手册页中的示例)
while inotifywait /home/user/Documents; do
#Do Something for each file change
done
作为 while 循环的每次迭代,您必须再次设置 inotifywait。但是使用第一个选项,我无法根据回报执行。理想情况下,我想要的是这样的回调函数
inotifywait -m --callback ./callback.sh /home/user/Documents
所以每次都会调用callback.sh
,返回值为inotifywait
。我将如何实现它?
【问题讨论】:
【参考方案1】:你可以像这样管道它:
inotifywait -m /my/directory | while read LINE; do ./do_something.sh $LINE; done
请记住,对于某些操作,您会收到许多事件,每个事件都会触发脚本的启动。
您还可以使用 perl 或其他语言直接使用 API,这为您提供了极大的灵活性。
【讨论】:
我从未使用过 Perl。我注意到很多示例都使用 C,但我更喜欢尽可能使用 shell。 总有机会使用命令的-e
开关过滤事件,和/或使用do_something.sh grep $LINE
获取相关事件。以上是关于Inotifywait 用于大目录的主要内容,如果未能解决你的问题,请参考以下文章