Grunt手表错误 - 等待...致命错误:观看ENOSPC

kds*_*kds 519 node.js gruntjs

为什么我Waiting...Fatal error: watch ENOSPC在运行监视任务时得到了什么?我该如何解决这个问题?

kds*_*kds 1344

做了一些研究后发现了解决方案.运行以下命令.

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

对于Arch Linux,将此行添加到/etc/sysctl.d/99-sysctl.conf:

fs.inotify.max_user_watches=524288
Run Code Online (Sandbox Code Playgroud)

  • 系统对用户可以观看的文件数量有限制.如果你让Grunt与Dropbox等其他程序一起运行,你可以很快耗尽手表.此命令可增加用户可以拥有的最大手表数量. (116认同)
  • 对于Arch Linux,将`fs.inotify.max_user_watches = 524288`添加到`/ etc/sysctl.d/99-sysctl.conf`然后执行`sysctl --system`.这也将在重新启动后持续存在.有关更多详细信息,请访问:https://wiki.archlinux.org/index.php/Sysctl (62认同)
  • 好吧,它似乎解决了我的问题......但是怎么样?为什么?您是否有任何资料来解释正在发生的事情(或正在发生的事情).或者你自己可以做到吗?不管怎样,谢谢... (43认同)
  • `npm dedupe`为我清理了它.[问题](https://github.com/gruntjs/grunt-contrib-watch/issues/236) (38认同)
  • **解释:****`echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf`**在文件/etc/sysctl.conf的末尾写入"fs.inotify.max_user_watches = 524288"**sudo sysctl -p`**重新配置内核在运行时,将文件/etc/sysctl.conf作为参数加载 (25认同)
  • 非常适合Ubuntu,感谢提示 (13认同)
  • Arch#2:响应tnajdek,我不得不将其添加到文件/usr/lib/sysctl.d/50-default.conf中 (2认同)
  • 在我的情况下,恶棍是Grunt使用LiveReload和指南针,Sublime看文件...非常感谢! (2认同)
  • 所以`log2 524288`是19. 19的意义是什么?为什么这个数字有效? (2认同)
  • 对于好奇:我有这个问题从Docker容器运行Grunt.我花了一段时间才意识到我需要从主机操作系统而不是从容器本身执行命令. (2认同)
  • @AdityaMP我刚刚找到了"魔术"号码的原因.引用"假设你将最大值设置为524288并且所有都被使用(不太可能),你将使用大约256MB/512MB的32位/ 64位内核内存." - 来自http://unix.stackexchange.com/questions/13751/kernel-inotify-watch-limit-reached (2认同)

gre*_*ade 184

任何时候你需要运行sudo something ...来修复某些东西,你应该暂停思考发生了什么.虽然这里接受的答案是完全有效的,但它正在治疗症状而不是问题.Sorta相当于购买更大的马鞍袋来解决问题:错误,无法将更多的垃圾装到小马上.小马已经装了很多垃圾,那小马正疲惫地晕倒.

另一种选择(可能与从小马中取出多余的垃圾并放入转储中)可以运行:

npm dedupe
Run Code Online (Sandbox Code Playgroud)

然后祝贺自己让小马开心.

  • 谢谢你让小马开心. (40认同)
  • 这得到了我的upvote,因为小马. (11认同)
  • 在我的情况下,我的问题似乎是安装Dropbox似乎使用了很多手表.所以我不得不使用:`fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf&& sudo sysctl -p`在接受的答案中,但+1教我`npm重复数据删除' (6认同)
  • 'npm dedupe'命令遍历你的npm模块树,并尽可能地在树中移动每个包.结果是一棵平树.它会移动包,即使它没有重复.在这种情况下,您可以在https://docs.npmjs.com/cli/dedupe上阅读有关不同版本模块的更多信息. (4认同)
  • 到底是做什么的?它肯定解决了我的问题.谢谢@grenade (2认同)

Arn*_* L. 34

在尝试手榴弹的答案后,您可以使用临时修复:

sudo bash -c 'echo 524288 > /proc/sys/fs/inotify/max_user_watches'
Run Code Online (Sandbox Code Playgroud)

这与kds的答案完全相同,但没有坚持更改.如果在系统正常运行一段时间后发生错误,这将非常有用.

  • 这应该是公认的答案,因为问题自然是由当前正在运行的而不是由错误的配置引起的(参见"小马"示例). (3认同)

Mic*_*wis 7

要找出谁正在创建inotify 实例,请尝试此命令():

for foo in /proc/*/fd/*; do readlink -f $foo; done | grep inotify | sort | uniq -c | sort -nr
Run Code Online (Sandbox Code Playgroud)

我看起来像这样:

 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
Run Code Online (Sandbox Code Playgroud)

使用ps -p 2857,我能够将过程2857识别为sublime_text.只有在关闭所有 sublime窗口后,我才能运行我的节点脚本.