我似乎无法解决 java.io.FileNotFoundException(系统中打开的文件太多)

我似乎无法解决 java.io.FileNotFoundException(系统中打开的文件太多)

免责声明。首先,我不是 SU。我是一个有一定经验的中级计算机用户。我可以编写一些基本代码,使用计算机已有 20 多年。多年来,我从 MSDOS 到 Windows,现在我在使用 OS X。我已经四处寻找了几个星期,所以决定向大佬们寻求帮助。我希望你同意。

首先,我在OS X 10.11.6

我的 Crashplan 备份软件出现了问题,我正与他们的支持人员一起努力解决。一切都归结为以下错误:

java.io.FileNotFoundException (Too many open files in system)

我阅读了相关内容,发现必须增加系统允许打开的文件数量。我通过创建并更改位于 中的文件的值来做到这一点/Library/LaunchDaemons

我创建了两个文件 limit.maxfiles.plistlimit.maxproc.plist

我放置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>54000</string>
      <string>54000</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>  

我在里面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>4096</string>
          <string>4096</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

launchctl limit maxfiles我重新启动并通过在终端上运行检查它是否生效。这表明它已经生效。

我再次启动 crashplan,它给出了相同的错误。我向 crashplan 人员核实,他们基本上说,问题就出在这里,去修复它(我认为这很公平)。

因此,我不断增加允许打开的文件数,直到达到 900000000)。是的,总共允许打开 9 亿个文件。比我整个驱动器上的数量还多。错误仍然存​​在。检查它launchctl limit maxfiles表明它已生效。

所以,这让我很困惑。然后我四处寻找,发现我可以运行这样的命令,ulimit -S -n 900000这将为系统的其他部分提供更多文件来使用。我不确定它是如何工作的,但我检查了一下,ulimit -a它确实有效。不过 Crashplan 也有同样的问题。

所以现在我不知道该怎么办,所以我来询问那些比大多数人更了解操作系统的人。有人能提供一些指导,告诉我可以尝试如何解决这个问题吗?

非常感谢。

答案1

也许这实际上回答了你的问题。将以下内容粘贴到终端窗口中:

while true; do
    sudo lsof |
       awk '{ files[$1]++ } END { for (key in files) { print key, files[key] } }' |
       sort -n -k 2 | tail -10 
    sleep 60;
done

这将做什么:

  • while true - 直到你中断它,例如 Control-C
  • lsof - 列出系统上所有打开的文件以及打开这些文件的进程(命令)的名称
  • awk-计算进程打开的文件数
  • sort - 按打开文件数对列表进行排序
  • tail - 报告打开文件最多的 10 个进程
  • sleep - 等一会儿,然后再做一遍

您应该立即看到罪魁祸首,否则不久之后它就会开始移向列表的末尾。

相关内容