有时我遇到以下错误:
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 );
(这是我正在创建的框架)
如您所见,文件auth.node.js由REQUIRE调用,因此具有gracefullFS和类似的给定解决方案不适合。此外,这个问题仅限于MacOS。在Ubuntu似乎工作正常。
有什么想法吗?
答案 0 :(得分:53)
答案 1 :(得分:43)
您可以通过增加maxfiles
限制来解决此问题:
launchctl limit maxfiles 16384 16384 && ulimit -n 16384
答案 2 :(得分: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
然后把
ulimit -n 65536 65536
进入〜/ .bashrc
欢呼声
蚂蚁
答案 3 :(得分:8)
您的代码打开的文件太多了。默认情况下,OS X限制为256个同时打开的文件。当您的代码需要一个新模块时,节点必须打开该文件才能读取它。如果您已经处于此限制,则节点的要求无法继续并将引发错误。您应该在应用程序中审核调用fs.open的位置,并确保正确关闭所有这些文件。如果您尝试同时执行太多文件系统读取,则可能还会遇到此问题,因为每个挂起的读取都将是一个打开的文件。我在使用fs.watchFile时也遇到了这个问题,这也需要打开文件的句柄。
答案 4 :(得分:5)
Check your ulimit. For example initialy my ulimit on OSX was 256.
ulimit -n
to see the limit. ulimit -n 1024
to set a higher limit.答案 5 :(得分:4)
其他答案都不适合我。这就是诀窍:
launchctl limit maxfiles 16384 16384
另外需要注意的是,这并不会在会话中保存,所以除非你想为每个bash终端会话运行它,否则我建议将上面的行放在〜/ .bashrc中(如果你使用的话,还是〜/ .zshrc) zsh)在命令行执行此操作:
vi ~/.bashrc
答案 6 :(得分:2)
如果您正在使用终端,ulimit非常棒,但只有在您从同一终端选项卡(或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>
答案 7 :(得分:1)
在OS X 10.10.3 Yosemite中,最大文件重置为256
。这可能导致npm安装出现问题。您可以使用命令ulimit -n
从终端检查此限制。要将此更改超出256
,您需要创建两个配置文件。
第一个属性列表文件/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
为bash配置文件(.bashrc
或.bashprofile
或类似文件)设置所需的限制:
ulimit -n 65536
ulimit -u 2048
确保bash配置文件的权限相同:
chmod 644 .your_bash_profile_file
重新启动计算机并检查ulimit -n
个最大文件。它应该是65536
,你应该能够在它之下改变它。
来源:http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X
答案 8 :(得分:1)
我正在使用watchman
。这为我解决了这个错误。值得尝试!!!
brew update
brew install watchman
答案 9 :(得分:0)
awongh的回答对我有用
ulimit -n 10480
但仅在启动交互式shell之后
sudo -i
在shell之外,我一直在OSX Yosemite上获得权限错误
答案 10 :(得分:0)
对于有关EMFILE错误的其他问题,您必须管理一个队列以限制同时打开的文件数。增加限制只会延迟您的问题。