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

Bad*_*bet 19 watchman react-native

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

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

在此处输入图片说明

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

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

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

sni*_*aka 97

您可以修复它,即增加 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
Run Code Online (Sandbox Code Playgroud)

当此限制不足以监视目录中的所有文件时,必须增加此限制才能使侦听正常工作。

您可以临时设置新的限制:

$ sudo sysctl fs.inotify.max_user_watches=524288
$ sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

如果您想让您的限制永久化,请使用:

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

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

  • 有人需要为此做出更好的解决方案。当我开始一个充满依赖项的新项目时,我不应该做这样的事情。 (11认同)
  • 哇,非常感谢,这解决了我在 React JS 中遇到的类似错误的问题,因为我的项目变得更大,但我无法理解错误的来龙去脉。这是一个正确的答案,祝你有美好的一天 (3认同)

Abd*_*eeh 34

您可以尝试编辑

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

cat /proc/sys/fs/inotify/max_user_watches

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

  • 这并没有解释问题是什么、解决方案是什么,或者解决方案如何解决问题。 (77认同)
  • 答案在文档中: ```watchOptions: {ignore: /node_modules/ }``` 阅读此处:https://webpack.js.org/configuration/watch/#watchoptionsignored (10认同)
  • 我们如何拿走观察者而不是允许更多观察者? (8认同)
  • 有些人似乎认为这是泄漏。是吗?我认为它确实需要将限制设置得非常高,因为根据设计,它实际上会监视大量文件。关闭手表不会有帮助。 (6认同)
  • 可行,但如果我没看错的话,它会提高限制。无论如何,我可以关闭打开的观察者吗? (5认同)

Pim*_*den 26

根本原因

上面的大多数答案都讨论了提高限制,而不是消除根本原因,这通常只是冗余监视的问题,通常针对 node_modules 中的文件。

网页包

答案在 webpack 5 文档中: watchOptions: { ignored: /node_modules/ }

只需阅读此处: https: //webpack.js.org/configuration/watch/#watchoptionsignored

文档甚至将其称为“提示”,引用:

如果观看不适合您,请尝试此选项。这可能有助于解决 VirtualBox、WSL、容器或 Docker 中的 NFS 和计算机问题。在这些情况下,请使用轮询间隔并忽略 /node_modules/ 等大型文件夹,以将 CPU 使用率保持在最低水平。

VS代码

VS Code 或任何代码编辑器也会创建大量文件监视。默认情况下,其中许多是完全多余的。在这里阅读更多相关信息:https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-错误-enospc

  • `watchOptions: {}` 去哪里了? (3认同)
  • webpack 配置 - 阅读 https://webpack.js.org/configuration/watch/#watchoptionsignored 上的文档 (2认同)
  • @PimHeijden 如果您解释了要更改哪些文件以及在哪里可以找到它们,而不是附加到其他页面的链接(实际上并没有回答这些问题),那么这可能会很有用。另外,如果这些系统需要这么多内存才能知道我的小得可笑的项目已经发生了变化,那么它们的编写就非常糟糕。 (2认同)
  • @PimvanderHeijden 1.因为这个系统在不同的项目中使用并给出了相同的问题,所以我来这里寻求解决方案。2.我不认为这“完全取决于”。 (2认同)

Dan*_*ira 17

请记住,这个问题是重复的:请参阅原始问题的答案

解决我的问题的一个简单方法是:

npm cache clear 
Run Code Online (Sandbox Code Playgroud)

今天的最佳实践是

npm cache verify 
Run Code Online (Sandbox Code Playgroud)

npm或由它控制的进程正在监视太多文件。更新构建节点上的 max_user_watches 可以永久修复该问题。对于 debian,请在终端上输入以下内容:

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

如果您想知道如何增加 inotify 观察者的数量,只需单击链接。


小智 16

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

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

解:

修改系统监控文件数

的Ubuntu

sudo gedit /etc/sysctl.conf

在底部添加一行

fs.inotify.max_user_watches=524288

然后保存并退出!

sudo sysctl -p

检查一下

然后就解决了!

  • 该数字是随机选择的还是您故意选择的?其他解决方案选择了相同的数字,我想知道为什么。 (16认同)
  • 524288 是 2^19。不确定其意义,但我尝试将其设置为 65536 (2^16),但仍然收到“达到限制”错误,所以我猜想在 2^16 和 2^19 之间的某个位置对于大多数用途来说已经足够高了。 (4认同)
  • @Pim Heijden:问题的最常见原因是轻量级系统编译内核时 fs.inotify.max_user_watches 的默认值较低。重量级开发工具(例如 VS Code 和 React 编译器)会监视每个源文件,以便决定何时重新触发按需编译。在功能更强大的系统上,默认值很大,并且问题永远不会发生。所以根本原因不是多余的文件监视。Raspbery Pi 操作系统开发人员希望在非开发用例中节省宝贵的内存。 (3认同)
  • 谢谢,这解决了!我刚刚开始我的项目并超出了限制(?),watchman 也在跟踪 node_modules/ 中的文件吗?如果是这样,有没有办法忽略该文件夹以节省资源? (2认同)

Kas*_*hif 14

在react.js中向我展示同样的错误我以这种方式修复希望也能在react native中工作

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

sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

现在您可以再次运行 npm start 。

npm start
Run Code Online (Sandbox Code Playgroud)


Hoa*_*ell 13

来自官方文档

“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 是可以观看的最大文件数,但如果您处于内存特别受限的环境中,您可能希望降低该数字。每个文件 watch 占用 540 字节(32 位)或 ~1kB(64 位),因此假设所有 524,288 个 watch 都被消耗掉,那么上限约为 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
  }
Run Code Online (Sandbox Code Playgroud)


MD *_*YON 12

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

    须藤 npm 开始

  2. 或者您可以删除node_modules文件夹并使用npm install重新安装

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

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

  • 1. 删除节点模块 [ sudo rm -rf node_modules/* ]。2.清除npm缓存[npm缓存清除--force]。3. 重新安装节点模块 [ npm i ]。4. 重新启动npm服务器。 (2认同)

Cos*_*ias 12

我使用 ubuntu 20 服务器,并在文件中添加 以下行: /etc/sysctl.conf

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

然后保存文件并运行

sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

之后一切正常!


小智 10

删除反应 node_modules

rm -r node_modules

yarn or npm install

yarn start or npm start
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么这有效?如果减少了正在监视的文件数量,重新安装必要的依赖项不会将文件添加回来吗? (4认同)
  • @icedwater 删除node_modules 会导致React 创建一个新的inotify 实例,并且其上没有监视。React 中可能存在泄漏,导致 inotify 实例被填满,这就是错误首先出现的原因。 (3认同)

sut*_*her 9

简单的解决方案:

我发现以前的解决方案对我的情况效果很好。我删除node_modules并清除了yarn / npm 缓存。

长尾解决方案: 如果您想要一个长尾解决方案 - 例如,如果您经常遇到此错误 - 您可以增加允许的观察者的值(取决于您的可用内存)

要计算出当前使用的观察者数量,您可以使用这个方便的 bash 脚本,而不仅仅是猜测:

https://github.com/fatso83/dotfiles/blob/master/utils/scripts/inotify-consumers

我建议将临时设置max_user_watches为一个较高的值:

sudo sysctl fs.inotify.max_user_watches=95524288  /run the script.
Run Code Online (Sandbox Code Playgroud)

如何计算您可以使用多少

每个观察者都需要

  • 540 字节(32 位系统),或
  • 1 kB(双 - 在 64 位操作系统上

因此,如果您想允许使用 512MB(在 64 位上),则可以设置 524288 作为值。

相反,您可以将要设置的内存量乘以 1024。

例子:

  512 * 1024 =   52488
 1024 * 1024 = 1048576 
Run Code Online (Sandbox Code Playgroud)

它向您显示当前使用的 inotify-consumers 的确切数量。因此,您可能对应该将限制增加多少有更好的想法。


小智 9

一般来说,我们不需要增加文件观察者的数量,在这种情况下,我们将有更多的观察者

我们需要删除多余的观察者,这些观察者变成了僵尸

问题是我们有许多文件观察程序正在填充我们的内存我们只需要删除这些文件观察程序(如果是节点)

killall node
Run Code Online (Sandbox Code Playgroud)


小智 8

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

sudo yarn start
Run Code Online (Sandbox Code Playgroud)

或者

sudo npm start
Run Code Online (Sandbox Code Playgroud)

  • 虽然这些命令可能会解决问题,但[包括解释](https://meta.stackexchange.com/q/114762) 如何以及为何解决问题将真正有助于提高帖子的质量,并且可能会产生结果更多的赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 (8认同)
  • 这是最糟糕的解决方案。“sudo”不适用于这种用途,并且也可能导致其他问题。 (4认同)

Rod*_*A92 8

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

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

我能够从这里发布的答案中解决它 (感谢他!)

所以,我跑了:

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

https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details阅读更多关于正在发生的事情

希望能帮助到你!


Vev*_*rke 7

sysctl -p在设置后使用该方法fs.inotify.max_user_watches对我来说不起作用(顺便说一下,此设置已经设置为很高的值,可能是我不久前尝试使用上面推荐的解决方法来解决此问题)。

我在这里找到的问题的最佳解决方案,下面我分享了解决该问题的执行步骤 - 在我的例子中,问题是在运行 Visual Studio 代码时发现的,但在其他情况下解决问题应该是相同的,例如您的情况:

  1. 使用此脚本来确定会话中哪些进程需要最多的文件观察程序。
  2. 然后,您可以查询当前的 max_user_watches 值sysctl fs.inotify.{max_queued_events,max_user_instances,max_user_watches},然后将其设置为不同的值(较低的值也可以) sudo sysctl -w fs.inotify.max_user_watches=16384
  3. 或者您可以简单地kill在 (1) 中找到消耗最多文件观察程序的进程(在我的例子中,baloo_file
  4. 然而,在重新启动系统时,可能需要再次执行上述操作 - 我们确定负责获取大部分文件观察程序的进程(在我的例子中 - baloo_file) - 在下次启动时将再次执行相同的操作。因此,要永久解决该问题 - 禁用或删除此服务/包。我禁用了它:balooctl disable

现在运行sudo code --user-data-dir,这次应该以管理员权限打开 vscode。(顺便说一句,当它不存在时 - 运行sudo code --user-data-dir --verbose看看问题是什么 - 这就是我发现它与文件观察者限制有关的方式)。

更新
您可以按照此处所述配置 VS 代码文件观察程序排除模式。这可能被证明是最终的解决方案,我只是不确定您总是会事先知道您不感兴趣观看哪些文件。


Ant*_*ter 6

另一个简单而好的解决方案是将其添加到 jest 配置中:

watchPathIgnorePatterns: ["<rootDir>/node_modules/", "<rootDir>/.git/"]
Run Code Online (Sandbox Code Playgroud)

这会忽略指定的目录以减少被扫描的文件


man*_*tel 5

如果您使用 VS Code 编辑器,任何编辑器都会因项目中的大量文件而出错。其中不需要 node_modules 和构建,因此从列表中删除。全部在 VS Code 文件菜单中打开

您必须过滤不必要的文件夹文件侧边栏

  1. 转到代码>首选项>设置

  2. 在搜索设置中搜索关键字“文件:排除”

  3. 添加图案

**/节点模块

**/建造

现在重新打开编辑器就可以了


归档时间:

查看次数:

13469 次

最近记录:

6 年,1 月 前