You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务实现开机自启

  1. 将调整后的.listen脚本移动到公共执行路径并赋予权限:
mv .listen /usr/local/bin/vue-watch.sh
chmod +x /usr/local/bin/vue-watch.sh
  1. 新建服务配置文件/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
  1. 配置服务权限和开机自启:
chmod +x /etc/init.d/vue-watch
chkconfig --add vue-watch
chkconfig vue-watch on
  1. 启动服务:
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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:06:01