错误:ENOSPC:已达到文件监视者数量的系统限制,监视:Ubuntu 18.04

错误:ENOSPC:已达到文件监视者数量的系统限制,监视:Ubuntu 18.04

在 VS Code 终端中启动 React 应用程序时,我收到了主题错误。我已看到以下主题问题的答案。

临时修复:

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
  1. 是什么导致了这个错误?因为我在第二天尝试运行该应用程序时遇到了这个问题,而我昨天已经使用相同的文件运行了该应用程序,没有任何问题?
  2. 除了 Ubuntu 中的节点模块之外,还可能发生这种情况吗?
  3. 如果我们设置这个数字,它会消耗内存。是否可以将其恢复为默认值 8192?如果不可能,这是 Ubuntu 的限制吗,需要在将来的版本中解决?

答案1

  1. 请参阅此答案stackchange(不是我的)

我怀疑前一天监视的情况仍然有效。

  1. 只要实例或监视用完,这种情况随时可能发生。请参阅上一个链接。用户 Oligofren 的脚本和解释非常出色。

  2. 终止监视进程应该有效。在我的计算机上,退出 VS Code 释放了约 470 个监视。

答案2

  1. 我认为至少从理论上讲,当同时观看太多文件时就会出现错误。

    如果你想知道哪个进程正在监视多少个文件回答链接到@VXDguy 的回答包含一个关联更复杂的脚本也应该显示特定的“INOTIFY WATCHER COUNT”。

    另一方面,如果您只想查看监视某些文件更改的进程列表,我认为您可以使用以下命令:

    sudo ls -l /proc/*/fd/* | grep notify | ps -p $(perl -n -e'/\/proc\/(\d*)\/fd/ && print "$1\n"')
    

    (基于:https://stackoverflow.com/a/2035538​​4/1505369,在其他帮助下:https://stackoverflow.com/a/2957781/1505369- 谢谢!)。
    但它没有显示正在监视的文件数,因此您只能猜测哪个进程是问题的主要根源。

  2. 您是在问未连接到 Node 的应用程序是否会影响此问题吗?如果是这样,我相信是的。我认为这个限制与 Node 无关,而是与系统有关。

  3. /etc/sysctl.conf我相信您可以通过手动编辑文件并删除或注释掉包含“fs.inotify.max_user_watches”的行然后运行来恢复默认限制sudo sysctl -p

    我也相信您也可以使用您自己发布的命令的修改版本来设置默认值(/etc/sysctl.conf但我建议使用第一个解决方案以免造成“污染”):

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

答案3

将系统设置更改为疯狂的值是一个坏主意,因此上面提到的 sysctl 内容最多是一个糟糕的“解决方法”,而根本不是一个“修复”。

一个解决方法是配置相关应用程序,使其不执行诸如监视整个文件系统等无意义的操作。例如,对于 VScode,可以添加一个files.watcherExclude属性${HOME}/.config/Code/User/settings.json,使其看起来像这样:

{
    "files.watcherExclude": {
        "**/.git/objects": true,
        "**/.git/subtree-cache": true,
        "**/.nfs*": true,
        "**/*.swp": true,
        "**/node_modules": true,
        "**/.next": true
    }
    /* ... other settings */
}

不幸的是,最近的版本(例如 1.79.2)存在缺陷并且不再支持它。

类似地,在 NextJS 项目根文件夹中,可以向项目添加next.config.js类似的设置,如下所示:

/** @type {import('next').NextConfig} */
const nextConfig = {
    reactStrictMode: true,
    webpack: function (config, options) {
        if (!config.watchOptions) {
            config.watchOptions = {
                aggregateTimeout: 5,
                //followSymlinks: false,
                ignored: [ '**/node_modules', '**/.git/**', '**/.next/**' ]
            };
        }
        config.module.rules.push({
            test: /\.svg$/i,
            issuer: /\.[jt]sx?$/,
            use: ['@svgr/webpack'],
        })
        return config;
    },
    experimental: {
        /* appDir: true, */
        instrumentationHook: true
    }
};
/*
process.on('unhandledRejection', error => {
    console.log('unhandledRejection', error);
});
*/
module.exports = nextConfig

仅当没有已知方法修复应用程序时,才应该在相关存储库上开立票据/创建新问题,并根据需要增加系统设置(即首先尝试 16K...),直到应用程序供应商修复了该问题。

答案4

从 :https://github.com/guard/listen/blob/master/README.md

做这个:

sudo sh -c "echo fs.inotify.max_user_watches=524288 >> /etc/sysctl.conf"
sudo sysctl -p

相关内容