proc 的限制和 ulimit -f 不匹配

proc 的限制和 ulimit -f 不匹配

我遇到一个问题,某个进程的最大文件大小与用户的 ulimit 不同。此进程的日志文件基本上不会超过 524288

过程:

less /proc/20238/limits

Limit                     Soft Limit           Hard Limit           Units
...
Max file size             524288               524288               bytes
...

限制:

ulimit -a

...
file size               (blocks, -f) unlimited
...

据我所知,启动该过程的脚本中没有设置 ulimit。

我也看过,/etc/security/limits.conf但只有nofile和的条目nproc

问:您知道还有什么可以设置文件大小限制吗?

如果有帮助的话,下面是启动该过程的简化版本:

nohup java $WALLET_OPTS -DOracleName="FileSender" -DAPP=FILE_SDR -Dapp_props=$APP_PROPS -Dfile_name=${FILE_NAME} -XX:+UseParallelGC -XX:+DisableExplicitGC -XX:-EliminateLocks $APPMEM -DDEBUG_MQSERVER=TRUE -classpath $CLASSPATH com.some.path.FileSdrSrv 10 1>> $APP_LOG/filesdr.log 2>&1 &

java 文件也没有设置 ulimit。 

答案1

如果您以 root 身份登录并以 su 身份登录,则 Ulimits 将从父进程继承。与直接以用户身份登录相比,您将获得不同的限制。

如果是 sysvinit,启动脚本也会出现同样的问题。systemd 稍有不同,但差别不大。

PAM 配置决定在哪些情况下加载限制。您可以在 man 中查看。

您应该检查是否有任何文件,/etc/security/limits.d/*.conf因为它们可能会覆盖默认值。

据我所知,默认值是在 limits.h 中设置的,但我不记得它在 rhel5 上的位置。

答案2

在使用 systemctl 管理服务的系统(如 centos 7)中,有一个特殊位置可以设置 systemctl 服务的限制。您可以将配置文件放在文件夹中/etc/systemd/system/$service_name.service.d/以覆盖 ulimit。您也可以将配置放在服务定义文件中。

例子:

[Service]
LimitFSIZE=1024

上述配置将会覆盖服务的“文件大小限制”。

在 CentOS 7 中编辑 SysV 服务的打开文件限制

https://fredrikaverpil.github.io/2016/04/27/systemd-and-resource-limits/

https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Process%20Properties

答案3

应用程序可以在启动时限制资源,总是可以设置比用户配置的值更严格的资源限制。见以下示例:

[centos@be0 ~]$ ulimit -n
32000
[centos@be0 ~]$ ulimit -n 16000
[centos@be0 ~]$ ulimit -n
16000
[centos@be0 ~]$ ulimit -n 32000
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[centos@be0 ~]$

相关内容