1

参看。OSX 上的FSEvents,默认情况下在触发事件之前收集超过 1 秒(超时可配置)的 FS 事件。

这样做的好处是将一系列文件系统更改收集到单个事件中(因此脚本不会运行超过它需要的时间),但会以延迟为代价。

例如,在 Vim 中保存一个文件会修改许多临时文件(它往往会删除一个缓冲区文件,更新一个撤消文件,并且还会创建然后删除一个名为 的测试文件4193)以及文件本身。在 OSX 上,使用使用此 API 的小工具(例如我的fswatch 分叉) ,所有这些都可以折叠成一个“批处理事件”,而inotifywait -m我指定的所有事件都在单独的行中通过流,这使得它变得不简单无需外部处理的组。

我很确定解决方案只是包装它并进行此处理,但我希望有一个隐藏的功能来指定像 FSEvents 允许的超时。

4

2 回答 2

2

我实际上开始相信这种事情不应该在inotify's 的功能范围内。

我还没有找到合适的解决方案,但在我看来,有某种形式的优雅方法可以做到这一点。这是我的起点(如果一秒钟内什么都看不到,它将退出,我希望在一秒钟内积累一些东西)

目前正在对此进行一些测试。这是我工作得很好的一些测试脚本。

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
于 2013-06-04T22:02:52.160 回答
0

我实现了https://github.com/bronger/watchdog,它可以帮助人们处理这个用例。“看门狗”允许在触发之前累积事件。此外,它捆绑了等效事件(例如多次写入同一个文件,或在更改文件后立即删除文件)。触发时,它会调用三个脚本之一:“copy”(一个文件被更改)、“delete”(一个文件/目录被删除)或“bulk_sync”(其他任何东西)。即使脚本正在运行,看门狗也会继续收集事件,以免丢失任何内容。

我编写它是为了有效地与远程计算机同步本地更改。但我自己也将它用于其他事情,只需将所有三个脚本符号链接到同一个脚本。

于 2021-08-16T07:40:36.537 回答