如何在 debian 中规避“打开的文件太多”

rub*_*o77 8 debian file-descriptors limit files ulimit

如果我想一次查看我的 apache2 服务器的所有相关日志文件,我使用

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon
Run Code Online (Sandbox Code Playgroud)

但由于现在这些文件太多,我想增加这个限制。

如何为一个 ssh 会话增加它?我怎样才能在全球范围内增加它?

我可以看到我的机器上的打开文件限制是 1024:

ulimit -n
1024
Run Code Online (Sandbox Code Playgroud)

pab*_*ouk 15

重要的是要知道有两种限制:

  • 一个硬限制是只有root配置。这是软限制的最高可能值(限制)。
  • 一个软限制可以由普通用户设置。这是有效的实际限制。

单个会话的解决方案

在 shell 中设置软限制:

ulimit -Sn 2048
Run Code Online (Sandbox Code Playgroud)

此示例将实际限制提高到 2048,但只有当硬限制(检查:)ulimit -Hn相同或更高时,该命令才会成功。如果您需要更高的值,请使用以下方法之一提高硬限制。这些限制是为每个进程设置的,它们由新产生的进程继承,因此您在同一 shell 中在此命令之后运行的任何内容都将具有新的限制。

在单个会话中更改硬限制

这并不容易,因为只有 root 可以更改硬限制,并且在切换到 root 后,您必须切换回原始用户。这是解决方案sudo

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""
Run Code Online (Sandbox Code Playgroud)

全系统解决方案

在 Debian 和许多其他使用的系统中,pam_limits您可以/etc/security/limits.conf/etc/security/limits.d. conf 文件包含描述。示例行:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192
Run Code Online (Sandbox Code Playgroud)

这将webadmins在登录后为组中的用户设置硬限制和默认软限制。

其他限制

硬限制值受打开文件描述符值的全局限制的限制,/proc/sys/fs/file-max在现代 Linux 发行版中,默认情况下该值非常高。此值受NR_OPEN内核编译期间使用的值限制。

没有更好的解决方案吗?

也许您可以检查*log您提供给的所有文件是否tail -f真的是需要监控的活动文件。有可能其中一些已经关闭以进行日志记录,您可以只打开较少数量的文件。