React Native错误:ENOSPC:达到文件监视程序数量的系统限制


160

我已经设置了一个新的空白反应本机应用程序。

安装了几个节点模块后,出现此错误。

Running application on PGN518.
internal/fs/watchers.js:173
   throw error;
   ^

Error: ENOSPC: System limit for number of file watchers reached, watch '/home/badis/Desktop/react-native/albums/node_modules/.staging'
   at FSWatcher.start (internal/fs/watchers.js:165:26)
   at Object.watch (fs.js:1253:11)
   at NodeWatcher.watchdir (/home/badis/Desktop/react-native/albums/node modules/sane/src/node watcher. js:175:20)
   at NodeWatcher.<anonymous> (/home/badis/Desktop/react-native/albums/node modules/sane/src/node watcher. js:310:16)
   at /home/badis/Desktop/react-native/albums/node modules/graceful-fs/polyfills.js:285:20
   at FSReqWrap.oncomplete (fs.js:154:5)

我知道这与看守人没有足够的空间来监视所有文件更改有关。

我想知道最好的行动方法是什么?

我应该node_modules通过将其添加到文件夹来忽略它.watchmanconfig吗?


24
切勿张贴代码,错误或输出的图像!stackoverflow.com/help/how-to-ask
Rob

1
您是否考虑过将某些代码添加到metro.config.js列表中?这应该减小扫描量:stackoverflow.com/questions/41813211/…–
deepelement

Answers:


268

Linux使用inotify包来观察文件系统事件,单个文件或目录。

由于React / Angular在保存时热重载和重新编译文件,因此需要跟踪所有项目的文件。增加inotify监视限制应隐藏警告消息。

您可以尝试编辑

# insert the new value into the system config
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

# check that the new value was applied
cat /proc/sys/fs/inotify/max_user_watches

# config variable name (not runnable)
fs.inotify.max_user_watches=524288

41
这不能解释问题是什么,解决方案是什么或解决方案如何解决问题。
Native Coder'Mar

2
哇,我遇到了如上所述的类似问题,但是这个解决方案100%解决了它。谢谢
akolliy 20-3-23

3
我们如何吸引观察者而不是允许更多观察者?
乔纳森

2
可行,但是如果我阅读此权利,它将提高限制。无论如何,我可以关闭已打开的观察程序吗?
zozo

1
@NativeCoder新版本可以解决该问题吗?
zardilior

183

该错误的意思是系统监视的文件数量已达到限制!!

结果:执行的命令失败!或引发警告(例如执行本机启动VSCode)

解:

修改系统监控文件数

的Ubuntu

sudo gedit /etc/sysctl.conf

在底部添加一行

fs.inotify.max_user_watches=524288

然后保存并退出!

sudo sysctl -p

检查一下

然后就解决了!


嘿,这在我的情况下解决了。也分享了我的帖子。谢谢
拉希德·汗

谢谢。这也解决了我的问题。
尼尔森·卡塔莱

谢谢!这对我有帮助。
WISERDIVISOR

65

您可以解决它,这增加了inotify观察者的数量。

如果您对技术细节不感兴趣,而只想听工作:

  • 如果您正在运行Debian,RedHat或其他类似的Linux发行版,请在终端中运行以下命令:

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

  • 如果您正在运行ArchLinux,请改为运行以下命令

    $ echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system

然后将其粘贴到您的终端中,然后按Enter键运行它。


技术细节

在Linux上,默认情况下,Listen使用inotify监视目录的更改。可以监视的文件数量受到系统限制的情况并不少见。例如,Ubuntu Lucid(64位)的inotify限制设置为8192。

您可以通过执行以下操作获取当前的inotify文件监视限制:

$ cat /proc/sys/fs/inotify/max_user_watches

如果此限制不足以监视目录中的所有文件,则必须增加该限制以使“侦听”正常工作。

您可以使用以下方法临时设置新的限额:

$ sudo sysctl fs.inotify.max_user_watches=524288
$ sudo sysctl -p

如果您想使限额永久不变,请使用:

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

您可能还需要注意的价值观max_queued_eventsmax_user_instances若监听抱怨不断。


2
哇,非常感谢,这解决了我的问题,因为我的项目变大了,React JS也出现了类似的错误,但我无法理解错误的出处。那是一个正确的答案,
祝你

4
有人需要对此进行更好的修复。当启动一个充满依赖性的新项目时,我不必做这样的事情。
Patrick W. McMahon

感谢您的详细回答!这对我帮助很大。我正在开发React Native,实际上RN cli需要更多的价值。因此,我成功使用上述命令更改了它。我只是想知道它的较高值是否会以不良方式影响性能和内存使用?
moondaddi

8

删除反应node_modules

rm -r node_modules

yarn or npm install

yarn start or npm start

如果发生错误,请再次使用此方法


为什么这样做?如果它减少了正在监视的文件数量,是否不重新安装必要的依赖项就将文件重新添加回去?
icedwater

2
@icedwater删除node_modules会导致React创建一个没有监视的新inotify实例。React可能存在泄漏,导致inotify实例被填满,这就是错误首先出现的原因。
扔掉帐户

7

官方文件

“ Visual Studio Code无法监视此大工作区中的文件更改”(错误ENOSPC)

当您看到此通知时,表明VS Code文件监视程序用完了句柄,因为工作空间很大并且包含许多文件。可以通过运行以下命令查看当前限制:

cat /proc/sys/fs/inotify/max_user_watches

可以通过编辑将限制增加到最大

/etc/sysctl.conf

并将此行添加到文件末尾:

fs.inotify.max_user_watches = 524288

然后可以通过运行来加载新值

须藤sysctl -p

请注意,Arch Linux的工作方式略有不同,有关详细信息,请参见增加inotify观察程序的数量。

524,288是可以查看的最大文件数,但是,如果您的环境特别受内存限制,则可能希望减少文件数。每个文件监视占用540字节(32位)或〜1kB(64位),因此假设所有524,288个监视都被消耗,则上限约为256MB(32位)或512MB(64位) )。

另外的选择

是使用files.watcherExclude设置从VS Code文件监视程序中排除特定的工作区目录。files.watcherExclude的默认值不包括node_modules和.git下的某些文件夹,但是您可以添加不希望VS Code跟踪的其他目录。

"files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/*/**": true
  }

7

我通过使用sudo即解决了这个问题

sudo yarn start

要么

sudo npm start

5
尽管这些命令可以解决问题,但包括如何解决以及如何解决该问题的说明,确实可以帮助提高帖子的质量,并可能导致更多的投票。请记住,您将来会为读者回答问题,而不仅仅是现在问的人。请编辑您的答案以添加说明,并指出适用的限制和假设。
布莱恩

到目前为止,这是不更改任何配置的最简单解决方案,但是正如@Brian所说,参考或解释将以有效的方式帮助您。
Genius

1
这是最糟糕的解决方案。sudo不适用于这种用途,也可能导致其他问题。
伊戈尔·帕拉

4

我在基于Debian的发行版上开发的节点应用程序发生了这种情况。首先,一个简单的重新启动解决了它,但是在另一个应用程序上又发生了。

由于它与inotify用于监视文件并查找目录中更改的观察者数量有关,因此您必须设置一个更大的数目作为限制:

我能够通过此处发布的答案解决问题 (感谢他!)

所以,我跑了:

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

https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details中详细了解正在发生的事情

希望能帮助到你!


1
在Manjaro上效果很好!
奥马尔·杜莱米

上面的链接需要权限,这里是自由之路机版本:web.archive.org/web/20200611175407/https://github.com/guard/...
马哈茂德·K.

1

正如@snishalaka指出的那样,您可以增加inotify观察者的数量。

但是,我认为默认值足够高,只有在未正确清理进程时才能达到默认值。因此,我只是按照有关github问题的建议重新启动了计算机,错误消息消失了。



0

我在linuxmint发行版上遇到了这个问题。当我在应用程序的/ public文件夹中添加了如此多的文件夹和子文件夹/文件时,似乎发生了这种情况。我应用了此修复程序,效果很好...

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

将目录更改为/ etc文件夹: cd /etc

然后运行: sudo systcl -p

您可能必须关闭终端,npm start然后才能使其正常工作。

如果失败了,我建议全局安装react-scripts并直接运行您的应用程序。

$ npm i -g --save react-scripts

然后npm start运行而不是react-scripts start运行您的应用程序。


0

如果您在Docker中运行项目,则应echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf在主机上执行和其他命令,因为容器将自动继承该设置(并且直接在其内部进行将不起作用)。


0

答案较晚,并且已经有很多好的答案。

如果您想要一个简单的脚本来检查最大文件监视是否足够大,如果不能,请增加限制,这里是:

#!/usr/bin/env bash

let current_watches=`sysctl -n fs.inotify.max_user_watches`

if (( current_watches < 80000 ))
then
  echo "Current max_user_watches ${current_watches} is less than 80000."
else
  echo "Current max_user_watches ${current_watches} is already equal to or greater than 80000."
  exit 0
fi

if sudo sysctl -w fs.inotify.max_user_watches=80000 && sudo sysctl -p && echo fs.inotify.max_user_watches=80000 | sudo tee /etc/sysctl.d/10-user-watches.conf
then
  echo "max_user_watches changed to 80000."
else
  echo "Could not change max_user_watches."
  exit 1
fi

该脚本将限制增加到80000,但是可以随意设置所需的限制。


-1
  1. 首先,您可以使用root权限每次运行

    sudo npm开始

  2. 或者,您可以删除node_modules文件夹并用于npm install再次安装

  3. 或者你可以得到永久的解决方案

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


-5

通过使用库,我遇到了同样的问题,wifi但是当我更改网络时,它运行正常。

更改您的网络连接


2
这可能是一条评论
Milan Desai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.