Nodemon错误:"已达到文件监视器数量的系统限制"

255

我正在学习GraphQL,并使用prisma-binding进行GraphQL操作。在启动我的Node.js服务器时,我遇到了这个nodemon错误,并且它给出了由graphql-cli自动生成的模式文件的路径。这个错误是关于什么的?

错误:

内部监听失败:ENOSPC:达到文件观察者数量的系统限制,观察'/media/rehan-sattar/Development/All projects/GrpahQl/graph-ql-course/graphql-prisma/src/generated'


这是Linux的ulimit错误,请参见此处 https://dev59.com/Z3VD5IYBdhLWcg3wRpaX - Janith
尝试过了!又出现了相同的错误! - Rehan Sattar
2
你可能正在监视太多的文件。也许包括 nod_modules 目录? - Mikkel
node_modules 是必要的,因为所有的包都在那里。我已经尝试杀掉之前在服务器端口上运行的进程,这对我有用,但我不知道现在需要多长时间:D - Rehan Sattar
12个回答

580

更新(05/2023)

评论区提供了一些技巧,我将它们整合在这个问题中以进行更新。如果你遇到这个问题,那么你很可能正在使用 Linux 发行版,并且你的项目正在达到系统文件监视器的限制。

通过执行以下命令来检查您当前的 inotify 文件监视器限制:

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

您可以使用以下代码临时设置新的限制:

$ sudo sysctl fs.inotify.max_user_watches=131070
$ sudo sysctl -p

或者您可以设置一个永久限制:

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

在这里,我们设置了131070个文件限制(如评论中@Dmitriy所建议的)。如果此限制对您的系统不起作用,则可以将此数字加倍。

此文档提供更多技术细节。

旧答案

如果您正在使用Linux,则您的项目已达到系统的文件监视器限制

要解决此问题,请在终端上尝试:

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

10
可以使用 sysctl --system 命令重新加载最新系统。 - YLJ
37
我们在执行此操作时是否还有其他需要注意的影响?我知道这可以帮助解决问题,我自己尝试过。但是我有点怀疑这个修复程序可能会引起什么副作用。 - Aldee
1
@Aldee 关于这个更改的技术影响,我建议查看这个维基页面:https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers#the-technical-details - Isac Moura
15
如果你不确定有多少个正在使用,我不建议大幅增加它。请使用以下命令检查正在使用的数量:find /proc/*/fd -user "$USER" -lname anon_inode:inotify -printf '%hinfo/%f\n' 2>/dev/null | xargs cat | grep -c '^inotify'。请注意,翻译过程中不改变原意,也不包含解释或其他额外信息。 - Nick Bull
7
在Ubuntu 21上,默认值为65535,将其设置为两倍的值(131070)可以解决我的Node JS问题。因此,根据最小化副作用的原则,在达到500k之前,值得尝试更小的增量。 - Dmitriy
显示剩余11条评论

76

您需要增加系统用户的inotify监视器限制。您可以在命令行中使用以下命令实现:

sudo sysctl fs.inotify.max_user_watches=xxxxx
sudo sysctl -w fs.inotify.max_user_watches=100000

不过这将只持续到您重启系统为止。要使其永久生效,请添加一个名为/etc/sysctl.d/10-user-watches.conf的文件,并将以下内容添加进去:


fs.inotify.max_user_watches = 100000

在进行上述(或任何其他)更改后,您可以使用sudo sysctl --system/etc中的所有sysctl配置文件重新加载设置。(在较旧的系统上,您可能需要改用sudo sysctl -p。)


非常感谢!对我很有用!!但是我在哪里添加这个文件? - Rehan Sattar
@RehanSattar 创建文件/etc/sysctl.d/10-user-watches.conf,并在其中输入fs.inotify.max_user_watches = 100000 - cjs
1
为了完整起见,将以下内容放在这里:echo fs.inotify.max_user_watches=100000 | sudo tee /etc/sysctl.d/10-user-watches.conf && sudo sysctl -p - RedHatter
9
使用 sysctl --system 命令来重新加载最新版本系统的设置。 - YLJ
1
@EricBurel 这是一个仅适用于Linux的答案;我从未在Mac上尝试过。然而,重新加载所有sysctl文件的选项是不正确的;我已经修复了它。 - cjs
显示剩余2条评论

71

在我的Ubuntu机器上使用Visual Studio Code时,有时会遇到这个问题。

在我的情况下,以下解决方法有所帮助:

停止监视器,关闭Visual Studio Code,启动监视器,然后再次打开Visual Studio Code。


没错!这是因为使用了VSCode。它应该是自动保存模式。 - Hùng Ng Vi
这对我很有效;使用ember-cli进行开发 - reiallenramos
就像我的焦点框,这种情况是间歇性的,而且重新启动VSCode是解决问题的方法,无需调整最大用户观察数。 (注意:当它工作时,我通常看到使用的观察器远低于7k) - CNSKnight

28
为了测试更改,我临时将参数设置为值524288。
sysctl -w fs.inotify.max_user_watches=524288

然后我开始验证:

npm run serve

问题已经解决。为了使其永久生效,您应尝试在文件“/etc/sysctl.conf”中添加一行,然后重新启动sysctl服务:

cat /etc/sysctl.conf | tail -n 2
fs.inotify.max_user_watches=524288

sudo systemctl restart systemd-sysctl.service

1
这个临时测试提示是无价的。谢谢。 - intmarinoreturn0

15

我曾经遇到过同样的问题,但我的问题源自于Webpack。幸运的是,他们在他们的网站上提供了一个很好的解决方案:

对于某些系统,监视大量文件可能会导致大量CPU或内存使用。可以使用正则表达式来排除类似node_modules这样的巨大文件夹:

文件 webpack.config.js

module.exports = {
  watchOptions: {
    ignored: /node_modules/
  }
};

10
这是关于 Linux 内核中的 inotify(inode 通知)问题,你可以使用以下命令解决它:
注:保留 HTML 标签。
  1. For a temporary solution until rebooting the pc, use the following command

    sudo sysctl -w fs.inotify.max_user_watches=100000
    
  2. A permanent solution: To make this permanent, add a file named /etc/sysctl.d/10-user-watches.conf with the following contents:

    fs.inotify.max_user_watches = 10000
    

在进行更改后,使用sudo sysctl -p重新加载/etc中所有sysctl配置文件中的设置。


第二项缺少一个零。 - MarcGuay

4

在我的情况下,当我在Linux服务器上执行nodemon命令时,我同时打开了Visual Studio Code(通过SSH连接到服务器)。根据Juri Sinitson的回答,我只需要关闭Visual Studio Code并再次运行nodemon命令即可。然后它就能工作了。

我的nodemon命令:

nodemon server.js 通过npm start命令运行


对我也起作用了。我基本上有两个VSCode打开。关闭之前的一个解决了这个问题。 - iheathers
这真是出乎意料的成功了! - Ahmed J.

3
我认为这里给出的大多数答案都是正确的,但使用 systemctl 命令重新启动我的服务解决了我的问题。请查看以下命令:
sudo systemctl restart systemd-sysctl.service

问题中没有提到平台。您能否在回答中添加Linux发行版、版本等信息(但是请勿添加“编辑:”、“更新:”或类似的内容——答案应该看起来像是今天写的)? - Peter Mortensen

3

很难知道应该将观察者数量增加多少,因此这里提供了一个实用工具,可以将观察者数量翻倍:

function get_inode_watcher_count() {
  find /proc/*/fd -user "$USER" -lname anon_inode:inotify -printf '%hinfo/%f\n' 2>/dev/null | 
  xargs cat | 
  grep -c '^inotify'
}

function set_inode_watchers() {
  sudo sysctl -w fs.inotify.max_user_watches="$1"
}

function double_inode_watchers() {
  watcher_count="$(get_inode_watcher_count)"
  set_inode_watchers "$((watcher_count * 2))"

  if test "$1" = "-p" || test "$1" = "--persist"; then
    echo "fs.inotify.max_user_watches = $((watcher_count * 2))" > /etc/sysctl.d/10-user-watches.conf
  fi
}

# Usage
double_inode_watchers
# to make the change persistent
double_inode_watchers --persist

1

我在使用Python和其venv模块时,同时也使用了Vite。由于venv文件夹中有大量文件(10k个),我遇到了相同的错误。

Vite配置允许忽略文件监视器中的目录,因此当忽略venv文件夹时,错误消失了。

export default defineConfig({
  server: {
    watch: {
      ignored: ['**/venv/**'],
    }
  },
})  

Vite文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接