调用一个命令,等待,然后执行另一个命令

调用一个命令,等待,然后执行另一个命令

这感觉就像我需要观看流(标准输入)的情况,如果有一行进入,请稍等片刻,然后触发命令并再等待一段时间。

使用 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-progresstouch /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

相关内容