Grunt监听错误 - 等待...致命错误:watch ENOSPC

531

当我运行watch任务时,为什么会出现Waiting...Fatal error: watch ENOSPC的错误?如何解决这个问题?


13
对于任何查看此内容的人,这不仅适用于 grunt,而且适用于使用 inotify 的任何程序。在 http://unix.stackexchange.com/questions/13751/kernel-inotify-watch-limit-reached 上有一个很好的解释。 - Jesse Good
7个回答

1373

进行了一些研究后找到了解决方案。运行以下命令:

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

对于Arch Linux,请将以下行添加到/etc/sysctl.d/99-sysctl.conf文件中:

fs.inotify.max_user_watches=524288

47
好的,看起来问题已经解决了……但是怎么解决的呢?为什么呢?你有没有任何来源可以解释正在发生或曾经发生的情况。或者你自己能解释吗? 无论如何,谢谢。 - slacktracer
116
系统对用户可以观察的文件数量有限制。如果你同时运行像Dropbox这样的其他程序和Grunt,你很快就会用完观察次数。这个命令可以增加用户的最大观察次数。 - Benjamin Manns
62
对于 Arch Linux,在 /etc/sysctl.d/99-sysctl.conf 文件中添加 fs.inotify.max_user_watches=524288,然后执行 sysctl --system 命令。这样设置将在重启后保持不变。更多详细信息请参见:https://wiki.archlinux.org/index.php/Sysctl。 - tnajdek
38
npm dedupe 让我明白了。问题 - reergymerej
25
将以下命令翻译为中文:echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf将"fs.inotify.max_user_watches=524288"这行内容写入到文件"/etc/sysctl.conf"的末尾。sudo sysctl -p重新配置内核参数,运行时加载文件"/etc/sysctl.conf"作为参数。 - kds
显示剩余26条评论

190

每当你需要运行 sudo something ... 来修复问题时,你应该停下来思考发生了什么。虽然这里的被接受的答案是完全有效的,但它只是在处理症状而不是问题本身。这有点像为解决“错误,无法将更多垃圾加载到小马身上”的问题而购买更大的马鞍包一样。小马已经装了太多垃圾,以致于小马因体力不支而昏倒。

另一个选择(也许相当于将多余的垃圾从小马上卸下并放到垃圾堆里)是运行:

npm dedupe

那就去祝贺自己,因为你让小马开心了。


44
感谢让小马开心。 - Christian
2
它到底做了什么?它肯定解决了我的问题。谢谢@grenade - Arjun K R
4
'npm dedupe' 命令会遍历你的 npm 模块树,并尽可能将每个包向上移动,结果是一个扁平的树形结构。即使一个包没有重复,它也会被移动。你可以在https://docs.npmjs.com/cli/dedupe了解更多关于不同版本模块在这种情况下会发生什么的信息。 - Arun Reddy
1
它没有帮助,我尝试了使用 sudo,现在对我来说它可以工作了。 - asedsami
6
在我的情况中,我的问题似乎是安装了Dropbox,它似乎使用了大量的监视器。所以我不得不使用以下命令:fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p(正如被接受的答案所述),但是感谢教给我 npm dedupe - Johann Echavarria
显示剩余5条评论

38

尝试grenade的答案后,您可以使用临时解决方案:

sudo bash -c 'echo 524288 > /proc/sys/fs/inotify/max_user_watches'

这与kds的答案做的事情相同,但不会保留更改。如果错误仅在您的系统正常运行一段时间后发生,则此功能非常有用。


3
这应该是被接受的答案,因为问题自然而然地是由当前正在运行的东西引起的,而不是由错误的配置引起的(参见“小马”例子)。 - arielnmz

8

要查找谁在创建inotify实例,可以尝试运行以下命令(来源):

for foo in /proc/*/fd/*; do readlink -f $foo; done | grep inotify | sort | uniq -c | sort -nr

我的看起来像这样:
 25 /proc/2857/fd/anon_inode:inotify
  9 /proc/2880/fd/anon_inode:inotify
  4 /proc/1375/fd/anon_inode:inotify
  3 /proc/1851/fd/anon_inode:inotify
  2 /proc/2611/fd/anon_inode:inotify
  2 /proc/2414/fd/anon_inode:inotify
  1 /proc/2992/fd/anon_inode:inotify

使用ps -p 2857命令,我确定了进程号为2857的进程是sublime_text。只有在关闭所有的sublime窗口后,我才能运行我的node脚本。

我也遇到了类似的问题,使用VSCode时出现了这个问题,但我认为这可能与文件监视有关。 - pcnate

3

在客户端PC崩溃后,我遇到了这个错误,我正在服务器上运行的jest --watch命令持续存在,然后我尝试再次运行jest --watch

上面的答案中描述的对/etc/sysctl.conf的添加解决了此问题,但是还很重要通过ps aux | grep node找到我的旧进程并用kill命令结束它。


0
在我的情况下,我发现我有一个针对Vim的激进插件,只需重新启动它即可。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接