Linux 上的 inotifywait 是不是允许在超时期间收集事件?
Posted
技术标签:
【中文标题】Linux 上的 inotifywait 是不是允许在超时期间收集事件?【英文标题】:Does inotifywait on Linux allow collection of events over a timeout period?Linux 上的 inotifywait 是否允许在超时期间收集事件? 【发布时间】:2013-06-03 22:04:51 【问题描述】:参见。 FSEvents 在 OSX 上,默认情况下在触发事件之前收集超过 1 秒(超时可配置)的 FS 事件。
这样做的好处是将一系列文件系统更改收集到单个事件中(因此脚本不会运行超过它需要的时间),但会以延迟为代价。
例如,在 Vim 中保存文件会修改许多临时文件(它往往会删除一个缓冲区文件,更新一个撤消文件,并且还会创建然后删除一个名为 4193
的测试文件)以及文件本身。在 OSX 上,使用使用此 API 的小工具(例如我的 fswatch 的 fork),所有这些都可以折叠成一个“批处理事件”,而使用 inotifywait -m
,我指定的所有事件都以单独的行通过流使没有外部处理的分组变得不简单。
我很确定解决方案只是包装它并执行此处理,但我希望有一个隐藏的功能来指定像 FSEvents 允许的超时。
【问题讨论】:
【参考方案1】:我实际上开始相信这种事情不应该在inotify
的功能范围内。
我还没有找到合适的解决方案,但在我看来,似乎有某种形式的优雅方法可以做到这一点。这是我的起点(如果一秒钟内什么都看不到,则退出,我希望在一秒钟内积累一些东西)
目前正在对此进行一些测试。这是我工作得很好的一些测试脚本。
group=0
( for val in 1..10; do echo "$RANDOM/10000" | bc | xargs sleep; echo $val; done ) | while true; do while read -t 1 line; do echo "read $group $line"; done; ((group++)); done
【讨论】:
inotify
不支持你描述的特性,你应该在应用层自己实现。【参考方案2】:
我实现了https://github.com/bronger/watchdog,它可以帮助人们处理这个用例。 “看门狗”允许在触发之前累积事件。此外,它捆绑了等效事件(例如,多次写入同一个文件,或在更改文件后立即删除文件)。触发时,它会调用三个脚本之一:“copy”(一个文件被更改)、“delete”(一个文件/目录被删除)或“bulk_sync”(其他任何东西)。即使脚本正在运行,看门狗也会继续收集事件,以免丢失任何内容。
我编写它是为了有效地与远程计算机同步本地更改。但我自己也将它用于其他事情,只需将所有三个脚本符号链接到同一个脚本。
【讨论】:
以上是关于Linux 上的 inotifywait 是不是允许在超时期间收集事件?的主要内容,如果未能解决你的问题,请参考以下文章
Mac 上是不是有类似“watch”或“inotifywait”的命令?