我遇到一个问题,某个进程的最大文件大小与用户的 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
上述配置将会覆盖服务的“文件大小限制”。
看
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 ~]$