在 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
- 是什么导致了这个错误?因为我在第二天尝试运行该应用程序时遇到了这个问题,而我昨天已经使用相同的文件运行了该应用程序,没有任何问题?
- 除了 Ubuntu 中的节点模块之外,还可能发生这种情况吗?
- 如果我们设置这个数字,它会消耗内存。是否可以将其恢复为默认值 8192?如果不可能,这是 Ubuntu 的限制吗,需要在将来的版本中解决?
答案1
- 请参阅此答案stackchange(不是我的)
我怀疑前一天监视的情况仍然有效。
只要实例或监视用完,这种情况随时可能发生。请参阅上一个链接。用户 Oligofren 的脚本和解释非常出色。
终止监视进程应该有效。在我的计算机上,退出 VS Code 释放了约 470 个监视。
答案2
我认为至少从理论上讲,当同时观看太多文件时就会出现错误。
如果你想知道哪个进程正在监视多少个文件回答链接到@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/20355384/1505369,在其他帮助下:https://stackoverflow.com/a/2957781/1505369- 谢谢!)。
但它没有显示正在监视的文件数,因此您只能猜测哪个进程是问题的主要根源。您是在问未连接到 Node 的应用程序是否会影响此问题吗?如果是这样,我相信是的。我认为这个限制与 Node 无关,而是与系统有关。
/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