![如何处理错误:系统中打开的文件太多?](https://linux22.com/image/558076/%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E9%94%99%E8%AF%AF%EF%BC%9A%E7%B3%BB%E7%BB%9F%E4%B8%AD%E6%89%93%E5%BC%80%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%AA%E5%A4%9A%EF%BC%9F.png)
我正在运行一个 cron 并将输出发送到我的 id 并得到以下输出:
/bin/sh:/usr/bin/php:系统中打开的文件过多
Cron每 5 分钟运行一次。
已检查/var/logs/cron
并发现 cron 每 5 分钟执行一次。
服务器上的站点运行良好。
答案1
这意味着您的系统用尽了文件句柄,无论是在您的 php 中还是在其他应用程序中。请确保关闭您打开的任何文件都会释放文件句柄。
要获取每个正在运行的程序的句柄数,请使用(以 root 身份):
for p in $(ps -A -o pid); do
nh=$(ls /proc/$p/fd 2>/dev/null | wc -l) &&
exe=$(readlink -f /proc/$p/exe 2>/dev/null) &&
echo "$p ($exe): $nh"
done
要获得更详细的输出,请使用lsof
。
您还可以通过修改来增加可能的系统文件句柄的数量/etc/security/limits.conf
(这会影响到/proc/sys/fs/file-max
),然后使用 减少当前终端会话中的值ulimit -n
。
答案2
通过以下方式检查系统当前打开了多少个文件:
$ sysctl kern.num_files
你的内核限制是多少:
$ sysctl kern.maxfiles
要检查哪些常规文件已打开,此命令可以帮助:
lsof | grep -w REG | less
如果您的限制太低,请通过以下命令增加它(以 root 身份运行):
sysctl -w kern.maxfiles=20480
sysctl -w kern.maxfilesperproc=4096
注意:sudo
如果从用户帐户运行,则需要添加。
然后再试一次。
要永久设置它,请将其添加到您的/etc/sysctl.conf
:
kern.maxfiles=20480
kern.maxfilesperproc=4096
如果您无权更改限制,请联系您的托管服务提供商。