抑制或防止重复的 inotifywait 事件?

Posted

技术标签:

【中文标题】抑制或防止重复的 inotifywait 事件?【英文标题】:Suppress or prevent duplicate inotifywait events? 【发布时间】:2017-07-23 13:41:34 【问题描述】:

目前inotifywait 正在监视 git 服务器文件夹。仅在修改特定文件时才发出结束。问题是,当更改推送到 git 服务器时,inotifywait 会触发几次。我不知道为什么。

那么接下来我该怎么做:防止inotifywait重复?

我在考虑算法:第一次触发时->睡眠脚本,因此它不会扫描下一个更改 5 秒->恢复脚本。但这听起来很愚蠢......你能帮我实现这个吗?谢谢!!

【问题讨论】:

您可能应该显示代码的相关部分。也许相关:inotify event IN_MODIFY occurring twice for tftp put。根据接受的答案,您可能应该使用IN_CLOSE_WRITE。另请参阅 Ubuntu.SE 上的 Why do inotify events fire more than once。 您跟踪的是哪个文件?可能它一次都没有改变。 【参考方案1】:

正如我在您的other question 中提到的,您可以先设置一个 post-receive 挂钩,只要有对 Git 服务器的推送,它就会为您检查 repo。

您不仅可以在监控结帐时更改的文件时测试您的inotify 函数,而且您甚至可以考虑使用inotify,并使用挂钩来触发您的通知。 post-receive hook can list files,然后您可以仅针对某些文件触发通知。

【讨论】:

【参考方案2】:

这是我根据自己的需要解决它的方法。我正在监视一个路径,以便它会自动编译语法错误。我对inotifywait 发出的重复事件感到困扰。将syncheck 函数添加到您的.bashrc

syncheck() 
  declare -A fileMap
  inotifywait --exclude .swp --format '%w%f' -e modify,create -m -r -q $* | \
  while read FILE; do
    es=$(date +'%s')
    case "$FILE" in
    *.hs)
    if [[ $fileMap[$FILE] != $es ]];then
        sdiff=$((es-$fileMap[$FILE]:-0))
        fileMap[$FILE]=$es
        ((sdiff < 3)) && continue
        ghc -fno-code $FILE
        echo "---------------------------------------------"
    fi
    ;;
    esac
  done

使用方法:

cd ~/src/proj/
. ~/.bashrc
syncheck .

在另一个终端中,在~/src/proj/ 位置修改或创建Haskell 文件。 syncheck while 循环会检测到这一点并自动编译语法错误。

这种重复事件抑制解决方案的关键思想是 Unix 的纪元秒数和 bash 字典。

【讨论】:

以上是关于抑制或防止重复的 inotifywait 事件?的主要内容,如果未能解决你的问题,请参考以下文章

inotifywait命令常用参数 Linux周末学习

使用 inotifywait 排队事件

Linux 上的 inotifywait 是不是允许在超时期间收集事件?

将 docx 转换为 PDF 时两次 inotifywait 触发事件

抑制xcodebuild输出或减少冗长[重复]

使用 inotifywait 监视多个目录并运行脚本