CentOS 6下inotifywait监听文件变动仅首次执行.build脚本如何解决
问题根因
该问题和是否设置为服务无关,核心错误是inotifywait的调用逻辑写错了:
- 你加了
--daemon参数,inotifywait会在启动成功后立刻退出前台进程并返回0状态码,此时&&后面的.build脚本只会在启动成功时执行1次,不会和后续的监听事件绑定 --monitor模式下的事件不会触发&&后面的逻辑,你需要循环读取inotifywait输出的事件来触发构建
修复方法
第一步:修改.listen脚本
替换原有内容为如下代码:
#!/bin/bash watch=~/vuejs/files build_script=~/.build # 去掉--daemon参数,通过管道循环读取监听事件 inotifywait --monitor --event modify,create,delete --recursive "$watch" | while read -r directory event file; do # 每次监听到事件就执行构建脚本,加flock防止短时间内多事件重复触发构建 flock -n /tmp/.build.lock "$build_script" done
修改后执行chmod +x .listen赋予执行权限,直接运行即可实现每次事件触发构建。如果需要临时后台运行,可执行nohup ./.listen >/dev/null 2>&1 &。
第二步(可选):配置为CentOS 6 SysV服务实现开机自启
- 将调整后的.listen脚本移动到公共执行路径并赋予权限:
mv .listen /usr/local/bin/vue-watch.sh chmod +x /usr/local/bin/vue-watch.sh
- 新建服务配置文件
/etc/init.d/vue-watch,内容如下:
#!/bin/bash # chkconfig: 2345 85 15 # description: Vue project file change monitor service prog="vue-watch" exec="/usr/local/bin/vue-watch.sh" pidfile="/var/run/${prog}.pid" start() { echo -n "Starting $prog: " nohup "$exec" >/dev/null 2>&1 & echo $! > "$pidfile" echo "done" } stop() { echo -n "Stopping $prog: " kill $(cat "$pidfile") 2>/dev/null rm -f "$pidfile" echo "done" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 esac exit 0
- 配置服务权限和开机自启:
chmod +x /etc/init.d/vue-watch chkconfig --add vue-watch chkconfig vue-watch on
- 启动服务:
service vue-watch start
优化建议
你现有.build脚本中的src_dir=/home/vue/vuejs/files/*通配符写在变量里可能会出现解析异常,建议调整为在cp命令处使用通配符:
- 变量改为
src_dir=/home/vue/vuejs/files - cp命令改为
cp -r "$src_dir"/* "$dest_dir"
内容的提问来源于stack exchange,提问作者Bryan C.
相关产品推荐
相关产品推荐

