在Mac OS上NodeJS错误"EMFILE,太多打开的文件"

bla*_*gus 53 macos node.js

有时候我遇到以下错误:

Error: EMFILE, too many open files  '/Users/blagus/Gallery/Websites/Nicsware/Pills/resources/core/auth.node.js'
    at Object.fs.openSync (fs.js:427:18)
    at Object.fs.readFileSync (fs.js:284:15)
    at Object.Module._extensions..js (module.js:473:44)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at instController  (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:79:31)
    at init (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:57:8)
    at route (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/dispatcher.node.js:268:36)
Run Code Online (Sandbox Code Playgroud)

调用此文件的代码行(mvc.node.js:79)是

    this.currentRoute.class = require( controllerFile )[dispatchClass].bind( this );
Run Code Online (Sandbox Code Playgroud)

(这是我正在创建的框架)

如您所见,文件auth.node.js由REQUIRE调用,因此具有gracefullFS和类似的给定解决方案不适合.此外,这个问题仅限于MacOS.在Ubuntu似乎工作得很好.

有什么想法吗?

awo*_*ngh 53

这对我有用:

ulimit -n 10480
Run Code Online (Sandbox Code Playgroud)

在这里找到

  • 正如瑞安在下面提到的那样 默认限制为256.将其设置为10480可能是矫枉过正.逐渐增加'ulimit -n 360` (13认同)
  • 也谢谢巷:)有人知道如何终止进程或关闭打开的文件吗? (2认同)

K M*_*lam 43

您可以通过增加maxfiles限制来解决此问题:

launchctl limit maxfiles 16384 16384 && ulimit -n 16384
Run Code Online (Sandbox Code Playgroud)

  • 我不会downvote,因为这个答案在技术上是正确的,但也非常危险,特别是因为从Lion到默认的同时文件数量是10000标记,在运行的机器上设置这个低限制可以使所有打开的程序无法使用第二.如果我们试图提高金额,让我们建议16384而不是2048 (4认同)
  • 你必须把 sudo 放在开头。直到我添加了 sudo 才起作用 (2认同)
  • 这似乎对我没有任何作用。 (2认同)

aqm*_*aqm 19

我有这个错误,ulimit和launchclt对我不起作用,

这个解决方案来自http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit为我工作

echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536
Run Code Online (Sandbox Code Playgroud)

然后把

ulimit -n 65536 65536
Run Code Online (Sandbox Code Playgroud)

进入〜/ .bashrc

干杯

蚂蚁


bh4*_*4th 11

我正在使用watchman. 这为我修复了这个错误。值得尝试!!!

brew update
brew install watchman
Run Code Online (Sandbox Code Playgroud)

  • 您能否提供一些有关其工作原理的背景信息?发布两个安装命令没有帮助。 (4认同)
  • 这是唯一对我有用的,在 Catalina 10.15.1 上。 (3认同)

Rya*_*son 8

您的代码打开了太多文件.默认情况下,OS X限制为256个同时打开的文件.当您的代码需要一个新模块时,节点必须打开该文件才能读取它.如果您已经处于此限制,则节点的要求无法继续并将引发错误.您应该在应用程序中审核调用fs.open的位置,并确保正确关闭所有这些文件.如果您尝试同时执行太多文件系统读取,则可能还会遇到此问题,因为每个挂起的读取都将是一个打开的文件.我在使用fs.watchFile时也遇到了这个问题,这也需要打开文件的句柄.


Joh*_*ner 6

其他答案都不适合我。这做到了:

launchctl limit maxfiles 16384 16384 
Run Code Online (Sandbox Code Playgroud)

另请注意,这不会跨会话保存,因此除非您想为每个 bash 终端会话运行它,否则我建议通过执行此操作将上述行放在您的 ~/.bashrc(或 ~/.zshrc,如果您使用 zsh)中在命令行:

vi ~/.bashrc
Run Code Online (Sandbox Code Playgroud)


Kor*_*clü 5

检查你的ulimit.例如,我在OSX上的ulimit是256.

  • 运行ulimit -n以查看限制.
  • 之后您可以ulimit -n 1024设置更高的限制.