本机错误:ENOSPC:系统限制的文件监视器数量已达到

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

在安装了几个节点模块后,我得到了这个错误。

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 ?

405739 次浏览

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

此错误的含义是系统监控的文件数量已达到限制!!

Result: The command executed failed!或者抛出一个警告(比如执行一个react-native start VSCode)

解决方案:

修改系统监控文件个数

Ubuntu

sudo gedit /etc/sysctl.conf

在底部加一条线

fs.inotify.max_user_watches=524288

然后保存并退出!

sudo sysctl -p

检查一下

那么问题就解决了!

官方文件:

“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位)的上限。

另一个选择

是排除特定的工作空间目录从VS Code文件监视器的文件。watcherExclude设置。文件的默认值。watcherExclude排除了node_modules和.git下的一些文件夹,但是你可以添加其他你不想让VS Code跟踪的目录。

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

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

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

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

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

  • 如果您运行的是ArchLinux,请执行以下命令

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

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


技术细节

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也有同样的问题,但当我改变我的网络时,它工作得很好。

更改网络连接

删除react node_modules

rm -r node_modules


yarn or npm install


yarn start or npm start

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

我用sudo解决了这个问题 即< / p >
sudo yarn start

sudo npm start

使用sudo来解决这个问题将迫使观察者的数量增加,而不应用任何修改系统设置。不建议使用sudo来解决这类问题,虽然这是一个必须由你做出的选择,希望你明智的选择。

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

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

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

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

更改目录到/etc文件夹: cd /etc < / p >

然后运行这个: sudo systcl -p < / p >

你可能不得不再次关闭你的终端和npm start来让它工作。

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

$ npm i -g --save react-scripts

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

我在基于Debian的发行版上开发一个节点应用程序时就遇到了这种情况。首先,一个简单的重启就解决了问题,但在另一个应用程序上又发生了这种情况。

因为它与inotify用来监视文件并查找目录更改的监视器数量有关,所以你必须设置一个更高的数字作为limit:

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

所以,我跑了:

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]。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启动

  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上运行,使用vi -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 < / p >

然后: https://github.com/vuejs/vue-cli/issues/2725#issuecomment-646777425 < / p >

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

vue.config.js

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

Vue 2.6.14版本

记住这个问题是重复的:在最初的问题中看到这个答案

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

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

如果你想知道如何增加inotify观察者的数量只点击链接。

我试着增加建议的数量,但它没有工作。

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

我重新启动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位系统),或
  • 1kb(双开64位操作系统

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

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

例子:

  512 * 1024 =   52488
1024 * 1024 = 1048576

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

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

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

  1. 使用这个脚本来确定会话中哪些进程需要最多的文件监视器。
  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看看问题是什么-这就是我如何计算出它与文件观察者限制有关)。

< p > 更新:
你可以配置VS代码这里描述的文件监视程序排除模式。这可能是最终的解决方案,我只是不确定你会事先知道哪些文件你不感兴趣看

要解决这个问题并不容易

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和build不需要,所以在列表中删除。所有打开在vs代码文件菜单

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

  1. 去代码>偏好比;设置

  2. 在搜索设置搜索关键字"文件:排除"

  3. < p >添加pettern

* * / node_modules

* * /构建

就是这样

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

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

谢谢@Antimatter它给了我诀窍。

根本原因

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

Webpack

答案在webpack 5 docs中: watchOptions: { ignored: /node_modules/ } < / p >

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

医生们甚至把这称为“提示”,引用如下:

如果观看对你不起作用,试试这个选项。这可能会有所帮助 NFS和VirtualBox、WSL、容器或机器中的问题 码头工人。在这些情况下,使用轮询间隔并忽略large 例如/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-error-enospc

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

fs.inotify.max_user_watches = 524288

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

在那之后,一切都很好!

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

我们需要移除多余的监视人员

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

killall node

试试这个,我面对它很长一段时间,但最后它是这样解决的,

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

之后最重要的一步是restart你的系统。

fs.inotify回响。Max_user_watches =524288 | sudo tee -a /etc/sysctl.conf &&Sudo sysctl -p

运行Npm后,在项目终端运行此代码

2个修复,如果你已经添加:fs.inotify.max_user_watches=524288

  1. 重启机器,一切都会恢复正常的
  2. 将引起问题的文件夹(对我来说是node_modules)重命名为任意名称(node_modilesa),然后重命名回来。这将删除linux放在这些文件夹上的手表。允许您再次正常编码。

验证最简单的方法,它是为我工作良好。

步骤1:停止服务器

步骤2:手动删除工作空间中'.angular'文件夹下的“cache”文件夹

步骤3:启动服务器

在react.js中显示我同样的错误,我修复了这种方式,希望在react本机也能工作

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


sudo sysctl -p

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

npm start