incrontab:修改已修改的文件

incrontab:修改已修改的文件

使用incrontab,我想监视一个文件,每当它被修改时,我想替换其中的字符串。但我猜这会造成无限循环。当我用下表配置它时:

/etc/file.md    IN_MODIFY   sed -i 's/Hello/Hi/g' $@

它有效一次,但再也不会。我没有看到任何错误消息,并且 的状态incrond保持良好,但我认为该服务陷入了无限循环。如果我重新启动它,它会再次工作一次。

有没有办法防止这种无限循环?或者还有另一种方法可以解决我的问题吗?

答案1

事实证明我并没有陷入无限循环,但我正在经历这个错误

修改我正在监视的文件的服务不仅会修改该文件,还会删除并重新创建它。通过删除,incrond停止观看,这可以在事件IN_IGNORED记录时确定。这就是为什么它总是在重新启动后才起作用一次incrond

为了不丢失文件中的手表,我使用了链接的 GitHub 问题中也提到的解决方法。我没有直接监视文件,而是监视其父目录。为了不对这个目录中的所有其他事件做出反应,我必须将sed命令放入脚本文件中,并为我感兴趣的文件名添加过滤器:

/etc    IN_CLOSE_WRITE  /home/user/myscript.sh $@ $#

/home/user/myscript.sh

#!/bin/bash
if [ "$2" == "file.md" ]; then
    sed -i 's/Hello/Hi/g' "$1/$2"
fi

我也更改IN_MODIFYIN_CLOSE_WRITE,因为IN_MODIFY对于我的需求来说似乎太早触发了一些毫秒。

幸运的是,上表不会创建循环,因为sed -i不会修改或写入文件,而是替换它(IN_MOVE_TO),所以没有IN_MODIFYIN_CLOSE_WRITE

相关内容