我有一个小脚本,它使用 inotifywait
监控文件的变化。当有变化发生时,一批文件会通过一个需要约10秒运行时间的处理过程(编译、压缩、重新组织等)。
考虑以下示例:
touch oli-test
inotifywait -mq oli-test | while read EV; do sleep 5; echo "$EV"; done
如果你在另一个终端运行touch oli-test
几次,你会发现每个循环都会在继续之前完成。这种情况对我来说非常真实。如果我在文件正在处理时忘记保存或者注意到一个错误,事件会堆积起来,我就需要等上数分钟。
在我的思考中,有两种技术可以让这个工作流程更加高效。我不确定哪一种是最简单或最好的,所以我把它们都列了出来:
打断之前的运行,并立即重新启动。目前脚本进程只是一组内联命令。我可以将它们拆分为Bash函数,但我不喜欢把它们再拆得更细。
去抖动等待处理的事项列表,这样如果同时发生五个事件(或者在它正在处理时),它只会再执行一次。
(或者两者都使用......因为我确信有些情况下两者都很有用)
我也可以接受与inotifywait
不同的方法,但它们必须给我相同的结果,并且在Ubuntu上工作。