这感觉就像我需要观看流(标准输入)的情况,如果有一行进入,请稍等片刻,然后触发命令并再等待一段时间。
使用 pyinotify 或 fswatch 等工具,我们可以监视文件夹中的更改,并在发现更改时将其回显。
fswatch --recursive --latency 2 src/ | xargs make build
或者
pyinotify -r -a -e IN_CLOSE_WRITE -c 'make build' src/
就我而言,我试图弄清楚如何make build
在文件更改时进行调用。虽然上述工具确实有效,但它们最终可能会make build
快速连续地进行多次调用。每个工具的工作方式略有不同,但最终结果是相同的(make 被调用太多)
我需要所有的旋转停止,1 秒过去,然后调用 make 一次。
有没有一些unix方法来批处理命令然后调用make?像这样的东西:
fswatch --recursive src/ | aggregate_and_wait --delay 1second | make build
答案1
让您的金丝雀(寻找更改的进程)在例如 处写入一个状态文件/var/run/build-needed
。
设置一个 cron 作业每分钟(或每五分钟,或您认为适合您的用例的任何频率)运行您的自动构建脚本,该脚本将:
- 检查
/var/run/build-needed
,如果它不比 更新/var/run/last-build
,则中止。 - 检查是否存在
/var/run/build-in-progress
,如果存在则中止。 - 创造
/var/run/build/in-progress
- 执行构建。
- 删除
/var/run/in-progress
和touch
/var/run/last-build
.
框架实现示例:
金丝雀进程:
pyinotify -r -a -e IN_CLOSE_WRITE -c 'touch /var/run/build-needed' src/
工作cron
:
*/5 * * * * /path/to/autobuilder.sh
构建器脚本:
#!/bin/bash
canaryfile="/var/run/build-needed"
lastbuild="/var/run/last-build"
inprogress="/var/run/build-in-progress"
needbuild="no"
if [[ -f "$canaryfile" ]]; then
if [[ -f "$lastbuild" ]] && [[ "$canaryfile" -nt "$lastbuild" ]]; then
needbuild="yes"
elif ! [[ -f "$lastbuild" ]]; then
needbuild="yes"
fi
fi
if ! [[ -f "$inprogress" && "yes" == "$needbuild" ]]; then
cd /path/to/src
touch "$inprogress"
if make build; then
rm "$inprogress"
touch "$lastbuild"
fi
fi