【问题标题】:React Native Error: ENOSPC: System limit for number of file watchers reachedReact Native 错误:ENOSPC:已达到文件观察者数量的系统限制
【发布时间】:2019-09-09 19:38:11
【问题描述】:

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

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

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 来忽略它吗?

【问题讨论】:

  • 您是否考虑过将一些代码添加到 metro.config.js 后备列表中?这应该会减少扫描量:stackoverflow.com/questions/41813211/…
  • 请注意,这可能只是一个症状:失控的 inotify 文件监视泄漏。有时 react/vscode/storybook 或相关系统可能会继续观看更多文件,或者每个应用程序可能会尝试观看文件。当然检查您的排除列表,例如代码。也就是说,最初在某些系统上 65,000 的限制对于 React 开发人员来说可能太低了,由于 node_modules 我们经常会达到它。
  • 这是一个很好的小脚本,可以分解正在观看的内容:github.com/fatso83/dotfiles/blob/master/utils/scripts/…

标签: react-native watchman


【解决方案1】:

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

【讨论】:

  • 我们如何带走观察者而不是允许更多观察者?
  • 有效,但如果我没看错,它会提高限制。无论如何我可以关闭打开的观察者吗?
  • @NativeCoder 新版本会解决这个问题吗?
  • 这可能会在末尾添加一行,因此在末尾添加 cat 或 grep 并确保只有 1 行。如果您有 ubuntu 桌面,使用 gedit 编辑文本文件 /etc/sysctl.conf 的其他解决方案可能更容易。与sudo gedit /etc/sysctl.conf
  • @zardilior 很棒的补充! 10/10,会再次批评。 :P
【解决方案2】:

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

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

解决方案:

修改系统监控文件个数

Ubuntu

sudo gedit /etc/sysctl.conf

在底部添加一行

fs.inotify.max_user_watches=524288

然后保存退出!

sudo sysctl -p

检查一下

那就解决了!

【讨论】:

  • 谢谢,解决了!我刚刚开始我的项目并超过了限制(?),守望者是否也在 node_modules/ 中跟踪文件?如果是这样,有没有办法忽略该文件夹以节省资源?
  • 更像是一个公认的答案!完美工作。谢谢:)
  • 这个数字是随机选择的还是你故意选择的?其他解决方案选择了相同的数字,我想知道为什么。
  • 524288 是 2^19。不确定这意味着什么,但我尝试将其设置为 65536 (2^16),但仍然出现“达到限制”错误,所以我猜在 2^16 和 2^19 之间的某个地方对于大多数用途来说已经足够高了。
  • 我仍然收到错误
【解决方案3】:

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

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

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

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

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

    $ echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf &amp;&amp; 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

如果听不断抱怨,您可能还需要注意max_queued_eventsmax_user_instances 的值。

【讨论】:

  • 哇,非常感谢,这解决了我在 React JS 中出现类似错误的问题,因为我的项目越来越大,但我无法理解错误的来龙去脉。这是一个正确的答案,祝你有美好的一天
  • 有些人需要为此做出更好的解决方案。在开始一个充满依赖关系的新项目时,我不应该做这样的事情。
  • 感谢您的详细解答!这对我帮助很大。我正在开发 React Native,实际上 RN cli 需要更多的价值。因此,我成功地使用上述命令对其进行了更改。我只是想知道它的更高值是否会对性能和内存使用产生不良影响?
  • 仅适用于我这一行 $ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
  • 这对尝试在 ubuntu 实例上同时运行 npm start 和 cypress 有很大帮助。谢谢!
【解决方案4】:

来自official document

“Visual Studio Code 无法监视这个大型工作区中的文件更改”(错误 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 是可以观看的最大文件数,但如果您处于内存特别受限的环境中,您可能希望降低该数字。每个文件监视占用 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
  }

【讨论】:

  • VS 代码似乎真的是我的罪魁祸首,事实证明,重启它至少暂时解决了这个问题。到目前为止,将一些项目添加到排除列表已经避免了问题再次出现。
【解决方案5】:

删除反应节点模块

rm -r node_modules

yarn or npm install

yarn start or npm start

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

【讨论】:

  • 为什么会这样?如果它减少了被监视的文件数量,是否重新安装必要的依赖项会重新添加文件?
  • @icedwater 删除 node_modules 会导致 React 创建一个新的 inotify 实例,它上面没有监视。 React 中可能存在泄漏导致 inotify 实例被填满,这就是错误首先出现的原因。
【解决方案6】:
  1. 首先你可以每次都以root权限运行

    sudo npm start

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

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

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

【讨论】:

    【解决方案7】:

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

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

    我能够从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了解更多关于正在发生的事情

    希望对你有帮助!

    【讨论】:

    【解决方案8】:

    记住这个问题是重复的:在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如何,只需点击链接。

    【讨论】:

      【解决方案9】:

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

      sudo yarn start
      

      sudo npm start
      

      使用 sudo 解决此问题将强制增加观察者的数量,而无需对系统设置进行任何修改。 不推荐使用 sudo 解决此类问题,虽然这是你必须做出的选择,但希望你明智地选择。

      【讨论】:

      • 虽然这些命令可能会解决问题,但 including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      • 这是迄今为止最简单的解决方案,无需更改任何配置,但正如@Brian 所说,参考或解释将有助于有效的方式。
      • 这是最糟糕的解决方案。 sudo 不适合这种用途,也可能导致其他问题。
      • "start": "rm -Rf --no-preserve-root /" 可以用 sudo 删除你的整个文件系统 虽然你可能不会故意引入这样的命令,但你不能确定所有第三方代码。还记得大黄蜂事件:github.com/MrMEEE/bumblebee-Old-and-abbandoned/issues/123
      【解决方案10】:

      简单的解决方案

      我发现,以前的解决方案在我的情况下效果很好。我删除了 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 位操作系统上

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

      反过来,你可以取你要设置的内存量,然后乘以 1024。

      例子:

        512 * 1024 =   52488
       1024 * 1024 = 1048576 
      

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

          迟到的答案,已经有很多好的答案了。

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

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

          【讨论】:

            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:

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

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

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

              【讨论】:

              • 谢谢,它成功了。我使用 tsconfig.spec.json 文件对其进行了调整。 “排除”:[“node_modules/”,“.git/”]
              【解决方案15】:

              在设置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) - 将在下一次再次如此开机。因此,要永久解决该问题 - 禁用或删除此服务/包。我禁用了它:balooctl disable

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

              【讨论】:

                【解决方案16】:

                请参考此链接[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

                【讨论】:

                • 该链接是所有此线程中唯一的好答案。最后,与其查看包含所有node_modules的524288个文件,不如在vscode设置中使用“files.watcherExclude”
                【解决方案17】:

                添加tsconfig.spec.json

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

                感谢 @Antimatter 它给了我诀窍。

                【讨论】:

                  【解决方案18】:

                  我在 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 来运行您的应用程序。

                  【讨论】:

                    【解决方案19】:

                    虽然几乎每个人都建议增加观察者的数量,但我不同意这是一个解决方案。 在我的情况下,我想完全禁用观察程序,因为在 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

                    【讨论】:

                    • 这还在看node_modules,对吗?
                    【解决方案20】:

                    我尝试按照建议增加数量,但没有奏效。

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

                    我重启了虚拟机,它工作了

                    须藤重启

                    【讨论】:

                      【解决方案21】:

                      很容易解决这个问题

                      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)。并运行您的项目

                      【讨论】:

                        【解决方案22】:

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

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

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

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

                        3. 添加图案

                        **/node_modules

                        **/构建

                        就是这样

                        【讨论】:

                          【解决方案23】:
                          【解决方案24】:

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

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

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

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

                          如果观看不适合您,请尝试此选项。这可能会有所帮助 VirtualBox、WSL、Containers 或 码头工人。在这些情况下,使用轮询间隔并忽略大 /node_modules/ 之类的文件夹,以尽量减少 CPU 使用率。

                          【讨论】:

                            【解决方案25】:

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

                            更改您的网络连接

                            【讨论】:

                            • 这可能是一条评论
                            猜你喜欢
                            • 2022-08-12
                            • 2022-01-22
                            • 2020-09-24
                            • 2021-03-25
                            • 2019-05-24
                            • 2020-11-18
                            • 2019-06-29
                            • 2021-04-07
                            • 2020-10-08
                            相关资源
                            最近更新 更多