免责声明。首先,我不是 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.plist
:limit.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 - 等一会儿,然后再做一遍
您应该立即看到罪魁祸首,否则不久之后它就会开始移向列表的末尾。