Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos “节点错误”;EMFILE,打开的文件太多“;在Mac OS上_Macos_Node.js - Fatal编程技术网

Macos “节点错误”;EMFILE,打开的文件太多“;在Mac OS上

Macos “节点错误”;EMFILE,打开的文件太多“;在Mac OS上,macos,node.js,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 (mo

有时我会出现以下错误:

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)的代码行是

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

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


有什么想法吗?

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

这对我来说很有效:

ulimit -n 10480

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

launchctl limit maxfiles 16384 16384 && ulimit -n 16384

其他答案都不适合我。这就成功了:

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

vi ~/.bashrc

如果您使用的是终端,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>
KeepAlive
运行负荷
软资源限制
文件数
16384

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

这个解决方案对我有效

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 10480
然后把

ulimit -n 65536 65536

进入
~/.bashrc

在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>
<?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
或类似文件):

确保bash配置文件的权限相同:

chmod 644 .your_bash_profile_file
重新启动计算机并检查
ulimit-n
max文件。它应该是
65536
,您应该可以在该值以下更改它

资料来源:


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

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

    • 阿翁的回答对我很有用

      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 10480
      
      但只有在启动交互式shell之后

      sudo -i
      

      在shell之外,我一直在OSX Yosemite上收到一个权限错误

      至于关于EMFILE错误的其他问题,您必须管理一个队列以限制同时打开的文件数量。增加限制只会延迟您的问题


      这里有一些回应:

      我正在使用
      看守人。为我修正了这个错误。值得一试

      brew update
      brew install watchman
      

      auth.node.js
      是否在做一些奇怪的事情?如果我在需要JS文件时生成stacktrace,
      fs.*
      不会显示。此外,这只是一个简单的需求,让我在查看堆栈跟踪时遇到麻烦,问题不是由
      require
      本身引起的,而是由您需要的模块引起的。再说一次,如果你不发布代码,这只是一个猜测…正如Ryan在下面提到的。默认限制为256。将其设置为10480可能有点过头了。以递增的方式增加它
      ulimit-n 360
      也谢谢Lane:)有人知道如何终止进程或关闭打开的文件吗?我不会投反对票,因为这个答案在技术上是正确的,但也非常危险,特别是因为Lion的默认并发文件数量是10000个左右,在运行中的计算机上设置此下限会使所有打开的程序在一秒钟内无法使用。让我们建议使用16384而不是2048,如果我们试图增加数量,那么这为我解决了问题,不再出现
      错误:EMFILE,打开的文件太多了
      !非常感谢。另外,我不确定我在做什么,但它是有效的。我很高兴知道这个问题背后的真正问题,为什么node会弹出这个错误消息。无论如何,谢谢你。我同意你的看法;我不确定提高限额对一些人来说是一个可以接受的答案,因为这是一个安全风险。我认为在现实中,gulp需要“放开”文件流。实现这一点的一种方法是通过shell脚本链接一些gulp任务。是的,这看起来很奇怪,但在大口大口喝的情况下还有什么选择呢?她将通过npm运行来完成或完成npm任务/脚本。你必须将sudo放在开头。直到我加上苏多特,它才起作用。这似乎对我没有任何帮助。你有任何资源来确保我在做你提到的事情吗?我更愿意练习更好地使用fs,而不是像其他人建议的那样不断提高限制。这是唯一一个对我有效的,关于Catalin