当文件有改动时执行命令,只能采用定时检测而不能采用触发?

2016-02-22 09:42:03 +08:00
 Counter
经常有这样的场景,当文件有改动后,希望它能执行某些操作,在不更改生成此文件的源程序前提下,似乎只能另外写脚本定时检测文件是否改动,再用此脚本执行相关操作,而不能采用触发,当文件改动时触发执行某脚本?
3100 次点击
所在节点    Linux
6 条回复
dorentus
2016-02-22 09:49:22 +08:00
可以用 inotify
reage
2016-02-22 09:54:42 +08:00
有很多语言都这个的实现。比如 node fs.watch 相关的, linux c 语言的 inotify, c#中的 FileSystemWatcher 。
本人写了一个代码同步工具。本地机器就是采用的 node 的 fs.watch ,检测到文件变化,然后,发送给服务端的。有兴趣 可以看下。 https://github.com/rentiansheng/devSync/blob/master/client/watch.js
dorentus
2016-02-22 10:29:52 +08:00
Counter
2016-02-23 16:06:35 +08:00
@dorentus
@reage

想要实现的效果是,保持监控文件 /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
dorentus
2016-02-23 16:43:17 +08:00
inotifywait 应该是一直等待,等到指定的 event 发生后,就退出了,所以外面的循环还是要的,你上面的代码应该也没啥问题。当然用下面的写法似乎也一样:


#!/bin/sh

while inotifywait -e MODIFY --format '1' /var/log/aaa.log; do
for (( i=1; i<=10; i++)); do
# 这里是要执行的代码,代码不使用到 inotifywait 的输出
done
done
Counter
2016-02-23 16:50:56 +08:00
@dorentus inotifywait 加参数 m 可以保持监控不退出,但是不知道怎么用在这里?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/258126

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX