React Native Error: ENOSPC: System limit for number of file watchers reached

React Native Error: ENOSPC: System limit for number of file watchers reached

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

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

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)

我知道这与 watchman 没有足够的 space 来监视所有文件更改有关。

我想知道在这里采取的最佳行动方案是什么?

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

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

这个错误的意思是系统监控的文件数量已经达到限制!!

结果:命令执行失败!或者抛出警告(比如执行一个react-native start VSCode)

解决方案:

修改系统监控文件个数

Ubuntu

sudo gedit /etc/sysctl.conf

在底部加一行

fs.inotify.max_user_watches=524288

然后保存退出!

sudo sysctl -p

检查一下

那就解决了!

来自official document

"Visual Studio Code is unable to watch for file changes in this large workspace"(错误 ENOSPC)

当您看到此通知时,表示 VS Code 文件观察器 运行 没有句柄,因为工作区很大并且包含许多文件。当前限制可以通过运行:

查看

cat /proc/sys/fs/inotify/max_user_watches

可以通过编辑

将限制增加到最大值

/etc/sysctl.conf

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

fs.inotify.max_user_watches=524288

然后可以通过 运行

加载新值

sudo sysctl -p

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

虽然 524,288 是可以观看的最大文件数,但如果您处于内存特别受限的环境中,您可能希望降低该数字。每个文件 watch 占用 540 字节(32 位)或 ~1kB(64 位),因此假设所有 524,288 个 watch 都被消耗,结果上限约为 256MB(32 位)或 512MB(64 位) ).

Another option

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

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

您可以修复它,增加 inotify 观察者的数量。

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

  • 如果您使用的是 运行Debian、RedHat 或其他类似的 Linux 发行版,运行 在终端中输入以下内容:

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

  • 如果你是运行ning ArchLinux,运行用下面的命令代替

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

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


技术细节

Listen 默认在 Linux 上使用 inotify 来监视目录的变化。系统对您可以监控的文件数量进行限制的情况并不少见。例如,Ubuntu Lucid 的(64 位)inotify 限制设置为 8192。

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

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

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

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

$ 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

如果listen一直报错,可能还需要注意max_queued_eventsmax_user_instances的值

我在使用库 wifi 时遇到了同样的问题,但是当我更改我的网络时它运行良好。

更改您的网络连接

删除反应node_modules

rm -r node_modules

yarn or npm install

yarn start or npm start

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

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

sudo yarn start

sudo npm start

使用sudo解决这个问题会强制增加watchers的数量,而无需在系统设置中应用任何修改。 不建议使用 sudo 来解决此类问题,虽然这是必须由您做出的选择,但希望您明智地选择。

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

不过,我认为默认值足够高,只有在进程未正确清理时才会达到。因此,我只是按照 related github issue 上的建议重新启动计算机,错误消息就消失了。

我在 linuxmint 发行版上遇到了这个问题。当有这么多文件夹并且 subfolders/files 我添加到我的应用程序中的 /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 改为 运行 您的应用程序。

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

因为它与inotify用来监视文件和查找目录变化的watcher数量有关,所以你必须设置一个更大的数量作为限制:

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

所以,我 运行:

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

发生的事情

希望对您有所帮助!

请参考此link[1]。 Visual Studio 代码中提到了对此错误消息的简要解释。我也遇到了同样的错误。在相关文件中添加以下参数将解决此问题。

 fs.inotify.max_user_watches=524288

[1] https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

  1. 首先你可以运行每次使用root权限

    sudo npm start

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

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

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

如果您是 运行 您在 Docker 中的项目,您应该在主机中执行 echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf 和所有其他命令,因为容器将自动继承该设置(并且直接在里面做是行不通的)。

回答晚了,已经有很多好的答案了。

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

#!/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,但您可以随意设置您想要的限制。

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

watchPathIgnorePatterns: ["<rootDir>/node_modules/", "<rootDir>/.git/"]

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

虽然几乎每个人都建议增加观察者的数量,但我不同意这是一个解决方案。 在我的例子中,我想完全禁用 watcher,因为 运行 在 CI 上使用 vui-cli 插件进行测试,该插件会为每个测试启动 web-pack-dev 服务器。

问题是:当几个构建同时 运行 时,它们会失败,因为达到观察者限制。

首先,我尝试将以下内容添加到 vue.config.js

module.exports = {
  devServer: {
    hot: false,
    liveReload: false
  }
}

参考:https://github.com/vuejs/vue-cli/issues/4368#issuecomment-515532738

它在本地工作但在 CI 上不工作(显然它在第二天也因为一些不明确的原因在本地停止工作)。

在调查 web-pack-dev 服务器文档后,我发现了这个: https://webpack.js.org/configuration/watch/#watch

然后是这个: https://github.com/vuejs/vue-cli/issues/2725#issuecomment-646777425

长话短说这最终解决了什么问题:

vue.config.js

module.exports = {
publicPath: process.env.PUBLIC_PATH,
devServer: {
    watchOptions: {
        ignored: process.env.CI ? "./": null,
  },
}

}

Vue 版本 2.6.14

记住这个问题是重复的:在 original question

查看这个答案

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

npm cache clear 

今天的最佳做法是

npm cache verify 

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

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

如果你想知道如何 Increase the amount of inotify watchers 只需点击 link。

我尝试按照建议增加数字,但没有用。

我看到当我登录我的 VM 时,它显示“需要重新启动”

我重新启动了 VM,它成功了

sudo 重启

简单的解决方案

我发现以前的解决方案在我的情况下效果很好。我删除了 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 和 运行 脚本。

如何计算您可以使用多少

每个观察者需要

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

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

换句话说,您可以将要设置的内存量乘以 1024。

示例:

  512 * 1024 =   52488
 1024 * 1024 = 1048576 

它显示了当前使用的 inotify-consumers 的确切数量。所以你可能有更好的想法,你应该增加多少限制。

在设置 fs.inotify.max_user_watches 后使用 sysctl -p 方法对我不起作用(顺便说一下,此设置已经设置为高值,可能是我前阵子试图解决这个问题之前,使用上面通常推荐的解决方法)。

我找到的问题的最佳解决方案 here,下面我分享解决它的执行步骤 - 在我的例子中,问题是在 运行 宁 visual studio 代码时发现的,但在其他情况下解决问题应该是一样的,比如你的:

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

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

更新:
您可以配置 VS 代码 file watcher exclusion patterns as described here。这可能被证明是最终的解决方案,我只是不确定你是否会事先知道哪些文件你不感兴趣。

解决这个问题很容易

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

和运行你的项目。

如果您的 /etc/sysctl.conf 中有 fs.inotify.max_user_watches=524288, 运行 相同的命令(echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf)。 运行 你的项目

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

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

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

  2. 在搜索设置中搜索关键字“files:exclude”

  3. 添加字母

**/node_modules

**/构建

就是这样

我在 Angular 13 中添加了 tsconfig.spec.json

 "exclude": [
    "node_modules/",
    ".git/"
  ]

谢谢 它给了我诀窍。

对于 vs 代码,请在此处查看详细说明: https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc

根本原因

上面的大多数答案都是关于提高限制,而不是关于消除根本原因,这通常只是一个多余的手表,通常用于 node_modules.

中的文件

Webpack

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

简单阅读这里:https://webpack.js.org/configuration/watch/#watchoptionsignored

文档甚至将此作为“提示”提及:

If watching does not work for you, try out this option. This may help issues with NFS and machines in VirtualBox, WSL, Containers, or Docker. In those cases, use a polling interval and ignore large folders like /node_modules/ to keep CPU usage minimal.

VS 代码

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

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

fs.inotify.max_user_watches=524288

然后保存文件并运行 sudo sysctl -p

之后一切正常!

通常我们不需要增加文件观察器的数量 在这种情况下,我们将有更多的观察者

我们需要删除多余的 watchers 成为僵尸

问题是我们有很多文件观察器正在填满我们的内存 我们只需要删除这些文件观察器(在节点的情况下)

killall node

尝试重新启动

我建议先重启系统,然后再观察。