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


8

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

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

但是由于这些文件现在太多了,所以我想增加该限制。

如何在一个ssh会话中增加它?以及如何在全球范围内将其增加?

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

ulimit -n
1024

超出文件限制通常是问题的征兆。如前所述,您可能会遇到日志轮换问题。(轮换的日志可能会删除您的命令。)在/ var / log / apache2之外,应该没有与您的Apache服务器相关的很多(任何)日志。根据您的grep模式,您可能希望限制对访问日志的访问。
BillThor

感谢您的提示,但我的logrotaion工作正常。我的日志太多,导致服务器上的所有1025个域都有自己的日志文件;)
rubo77

1
您的模式看起来像他们还将拾取错误日志以及访问日志。如果您只有一个错误日志,这应该是一个小问题。如果将此内容保留在外壳程序中,则可能要使用-F而不是,-f因此旋转日志时会重新打开日志。
BillThor

Answers:


15

知道有两种限制很重要:

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

单个会话的解决方案

在外壳中设置软限制:

ulimit -Sn 2048

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

在单个会话中更改硬限制

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

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

全系统解决方案

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

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

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

其他限制

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

有没有更好的解决方案?

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


ulimit -Sn 4096 -bash:ulimit:打开文件:Kann die Grenze nichtändern:Das Argument
istungültig-

@ rubo77:我添加了有关硬限制的信息,这很可能是造成问题的原因。
pabouk

@ rubo77:也可以在shell会话中设置硬限制,但是由于必须su生根并su返回给用户,所以它很棘手:su -c "ulimit -Hn 6000 ; su $USER"
pabouk

好吧,所以暂时更改限制,我将以ulimit -Hn 6000; ulimit -Sn 6000root用户
身份

1
@amenthes我猜你的意思是中的配置文件/etc/limits.*。只要pam_limits.so调用PAM模块,就会应用这些限制。通常是在会话开始时。例如在Ubuntu 14.04它是在这些工具/命令:cronlogin(文本控制台登录), lightdm(在GUI登录), su。您可以在中设置pam_limits使用位置/etc/pam.*。参见例如:faqs.org/docs/securing/chap5sec44.html
pabouk

0

我在Apache error.log中有PHP警告:

failed to open stream: Too many open files in ...

因此我发现,apache在启动时(在我的Ubuntu 14.04上)分别设置了该值。在中配置/etc/apache2/envvars。它说:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

所以我不得不调整第三行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.