如何处理错误:系统中打开的文件太多?

如何处理错误:系统中打开的文件太多?

我正在运行一个 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

如果您无权更改限制,请联系您的托管服务提供商。

相关内容