gulp watch error – ENOSPC

当我在Ubuntu下运行gulp.watch的时候,提示一个非常诡异的错误信息,因为在windows下都没有这个问题,具体体现信息如下:

ttang@morningstar:~/dev/componer$ gulp watch --name=browser-logger
[10:05:43] Requiring external module babel-register
[10:05:44] Using gulpfile ~/dev/componer/gulpfile.babel.js
[10:05:44] Starting 'watch'...
[10:05:44] 'watch' errored after 14 ms
[10:05:44] Error: watch /home/ttang/dev/componer/components/browser-logger/src/js ENOSPC
    at exports._errnoException (util.js:1026:11)
    at FSWatcher.start (fs.js:1429:19)
    at Object.fs.watch (fs.js:1456:11)
    at Gaze._watchDir (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:289:30)
    at /home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:358:10
    at iterate (/home/ttang/dev/componer/node_modules/gaze/lib/helper.js:52:5)
    at Object.forEachSeries (/home/ttang/dev/componer/node_modules/gaze/lib/helper.js:66:3)
    at Gaze._initWatched (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:354:10)
    at Gaze.add (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:177:8)
    at new Gaze (/home/ttang/dev/componer/node_modules/gaze/lib/gaze.js:74:10)

这是在公司的虚拟机里面跑,只有内网可以访问,所以暴露一下路径也无所谓。

这个问题是怎么产生的呢?这是因为在一个系统里,能够被监听的文件数量上限是一定的,node的监听其实是调用了fs.watch,从上面的错误信息也可以看到相关提示,fs.watch的监听数量在不同的系统里面不一样,所以有可能我的windows下面这个值很大,而在虚拟机里面很小(在家里的Ubuntu下也比较大,应该是跟虚拟机有关),所以我们应该想办法增加这个监听数量值。在终端运行下面的代码:

echo fs.inotify.max_user_watches=582222 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

这样就增加了fs.watch是文件数量上限。这样无论是gulp的watch,还是其他基于fs.watch写的模块,都可以正常运行了。

这个issue已经在gulp的官方github上得到回复,具体链接

更新:而且这个问题还会引起sublime左侧文件目录不会随着更改自动更新,比如你重命名了文件,或者删除文件夹,左侧目录都不更新。解决sublime这个问题可以使用一个替代方案:打开preferences->key bindings,添加如下内容:

{ "keys": ["f5"], "command": "refresh_folder_list" }

这样当你发现左侧目录没有实时更新时,可以通过按F5键来刷新。

2016-12-02 | , ,