![Linux 没有正确执行限制?](https://linux22.com/image/172321/Linux%20%E6%B2%A1%E6%9C%89%E6%AD%A3%E7%A1%AE%E6%89%A7%E8%A1%8C%E9%99%90%E5%88%B6%EF%BC%9F.png)
作为测试系统上的实验,我尝试使用/etc/security/limits.conf
.当登录系统时,我有 16 个进程在运行(所有进程都有 ruid、euid 和 suid 到我的 uid)。
我尝试首先将硬限制和软限制设置为 20。我注销后无法再次登录,因为我无法创建进程。我将限制提高到 30 个,但仍然无法进入。当我将限制提高到 50 个进程时,我可以进入,但zsh
抛出了一些错误。我发现我可以再创建 2 个进程,仅此而已。
我的问题是,为什么如果我将限制设置为 N(在本例中为 20),它不会确切地强制 N 个进程作为限制?如果用户接近限制,它会触发限制吗?否则我不明白为什么当我仍有空间低于限制时它不允许我创建更多进程。
在标准 Debian(基于 systemd)上运行 Linux 4.19
编辑:
要计算我尝试过的进程:
ps ux
:这会产生 14 个进程
为了更好地衡量
cat /proc/*/status | grep Uid | grep 1000 | wc -l
:产生 16 个进程。
预期的差异是由于 oneliner 使用的额外流程造成的。
(我的 uid)的输出grep 1000
是:
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
Uid: 1000 1000 1000 1000
这表明所有都以真实、有效、保存且 fsuid 1000(我)的身份运行
我相信我正好有 13 个进程,因为我信任它ps
并且它自己计数,所以它应该是 13 个,对吗?
答案1
按照man 2 setrlimit
:
RLIMIT_NPROC This is a limit on the number of extant process (or, more precisely on Linux, threads)
可以说,这有点违反直觉。无论如何,登录进程可能会产生大量线程,当线程数设置为 20 或 30 左右时,这些线程就会超出限制。
我测试了登录,然后降低限制,并分叉简单的单线程进程,直到出现错误。限制的表现符合预期。