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

有一段时间我有以下错误:

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) 

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

  this.currentRoute.class = require( controllerFile )[dispatchClass].bind( this ); 

(这是我创build的框架)

正如你所看到的,文件auth.node.js被REQUIRE调用,所以给定的与gracefullFS和类似的解决scheme不适合。 此外,这个问题只适用于MacOS。 在Ubuntu似乎工作得很好。

有什么想法吗?

这对我工作:

 ulimit -n 10480 

在这里find

你可以通过增加maxfiles限制来解决这个问题:

 launchctl limit maxfiles 16384 16384 && ulimit -n 16384 

我有这个错误,ulimit和launchclt没有为我工作,

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

 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 

然后把这个

 ulimit -n 65536 65536 

进入〜/ .bashrc

干杯

ant

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

检查你的ulimit。 例如,最初我在OSX上的ulimit是256。

  • 运行ulimit -n查看限制。
  • 之后你可以用ulimit -n 1024来设置一个更高的限制。

没有其他答案为我工作。 这个诀窍:

 launchctl limit maxfiles 16384 16384 

另外要注意的是,这并不会保存在会话中,所以除非你想为每个bashterminal会话运行它,否则我build议把上面这行放在你的〜/ .bashrc(或者如果你使用zsh是〜/ .zshrc)在命令行:

 vi ~/.bashrc 

如果你正在使用terminal,ulimit是非常棒的,但是它只有在你从同一个terminal标签(或者shell实例)运行你的应用程序时才有效。 Launchctl是伟大的,但系统范围。 如果单独保留Launchctl limit maxfile,软限制为256,硬限制为无限制。

在生产环境中,您可能需要在启动时启动并重新启动崩溃,这意味着Mac OSX的最佳答案是为每个应用程序使用.plist文件。 我使用plist文件启动我的节点应用程序(在启动时运行并在崩溃后重新启动)…在此文件中,您可以使用SoftResourcesLimit项设置每个应用程序的文件数量。

 <key>KeepAlive</key> <true/> <key>RunAtLoad</key> <true/> <key>SoftResourceLimits</key> <dict> <key>NumberOfFiles</key> <integer>16384</integer> </dict> 

OS X 10.10.3优胜美地的最大文件被重置为256 。 这可能会导致npm安装出现问题。 你可以用命令ulimit -n从terminal检查这个限制。 为了改变这个超过256 ,你需要创build两个configuration文件。

第一个属性列表文件/Library/LaunchDaemons/limit.maxfiles.plist

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>limit.maxfiles</string> <key>ProgramArguments</key> <array> <string>launchctl</string> <string>limit</string> <string>maxfiles</string> <string>65536</string> <string>65536</string> </array> <key>RunAtLoad</key> <true/> <key>ServiceIPC</key> <false/> </dict> </plist> 

第二个属性列表文件/Library/LaunchDaemons/limit.maxproc.plist

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>limit.maxproc</string> <key>ProgramArguments</key> <array> <string>launchctl</string> <string>limit</string> <string>maxproc</string> <string>2048</string> <string>2048</string> </array> <key>RunAtLoad</key> <true /> <key>ServiceIPC</key> <false /> </dict> </plist> 

设置适当的所有权和权利:

 sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist sudo chmod 644 /Library/LaunchDaemons/limit.maxproc.plist 

将所需限制设置为bashconfiguration文件( .bashrc.bashprofile或类似文件):

 ulimit -n 65536 ulimit -u 2048 

确保bashconfiguration文件的权限相同:

 chmod 644 .your_bash_profile_file 

重新启动计算机并检查ulimit -n max文件。 它应该是65536 ,你应该能够改变它下面的任何东西。

资料来源: http : //docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X

awongh的答案为我工作

 ulimit -n 10480 

但是只有在启动交互式shell之后

 sudo -i 

在shell之外,我一直在OSX Yosemite上遇到许可错误