使用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_MODIFY
为IN_CLOSE_WRITE
,因为IN_MODIFY
对于我的需求来说似乎太早触发了一些毫秒。
幸运的是,上表不会创建循环,因为sed -i
不会修改或写入文件,而是替换它(IN_MOVE_TO
),所以没有IN_MODIFY
或IN_CLOSE_WRITE
。