技术解析

当文件有改动时执行命令,只能采用定时检测而不能采用触发?
0
2021-07-05 05:54:35
idczone
经常有这样的场景,当文件有改动后,希望它能执行某些操作,在不更改生成此文件的源程序前提下,似乎只能另外写脚本定时检测文件是否改动,再用此脚本执行相关操作,而不能采用触发,当文件改动时触发执行某脚本?
可以用 inotify

有很多语言都这个的实现。比如 node fs.watch 相关的, linux c 语言的 inotify, cFileSystemWatcher 。
本人写了一个代码同步工具。本地机器就是采用的 node 的 fs.watch ,检测到文件变化,然后,发送给服务端的。有兴趣 可以看下。 https://github.com/rentiansheng/devSync/blob/master/client/watch.js

Ruby 版:
https://gist.github.com/dorentus/fa56408220aec640eca4



想要实现的效果是,保持监控文件 /var/log/aaa.log ,当文件被修改时执行 10 遍 for 循环,下面是整个 bash 脚本代码:
while [ true ]; do
if [ $(inotifywait -e MODIFY --format '1' /var/log/aaa.log) -eq 1 ]; then
for (( i=1; i<=10; i++)); do
inotifywait 的输出
done
fi
done
这里有个问题,如何把 inotifywait 加了参数 m ,把外层的 while 循环换掉?改成下面这样不行
inotifywait -me MODIFY --format '1' /var/log/aaa.log | for (( i=1; i<=10; i++)); do
inotifywait 的输出
done

inotifywait 应该是一直等待,等到指定的 event 发生后,就退出了,所以外面的循环还是要的,你上面的代码应该也没啥问题。当然用下面的写法似乎也一样:

/>
while inotifywait -e MODIFY --format '1' /var/log/aaa.log; do
for (( i=1; i<=10; i++)); do
这里是要执行的代码,代码不使用到 inotifywait 的输出
done
done

inotifywait 加参数 m 可以保持监控不退出,但是不知道怎么用在这里?

数据地带为您的网站提供全球顶级IDC资源