我注意到在 /etc/security/limits.conf 中,限制是基于每个用户(或每个组)配置的,例如:@faculty hard nproc 50
我假设设置限制的是setrlimit,但是setrlimit是在进程的基础上工作的,也就是说,它只在它的调用进程上设置资源限制,所以既然它不能对用户设置限制,那么操作系统如何尊重在limits.conf 中配置的资源限制?
另一个问题,如果某个进程超过了它的资源配额,它会被杀死吗?如果是这样,通过什么信号?谢谢你。
正如已经回答的那样,操作系统尊重每个进程的用户限制,而不是每个用户。
如果您希望限制适用于属于用户的所有进程,您可以使用控制 cgroup:
您可以为每个用户/组设置硬限制和软限制。为了能够更改自己的硬限制,进程需要具有特权(root)。当进程试图超过其软限制时会发生什么取决于资源:
malloc
并且new
会失败查看setrlimit 手册页以获取更多信息。
在limits.conf 中,您为指定的用户/组分配每个进程的限制。因此,如果您为用户 X 设置了 10MB 的堆栈限制,这意味着使用用户 X 凭据执行的每个进程都设置了 10MB 的堆栈限制。它不是描述用户 X 拥有的所有进程的“资源总和”的限制
从man setrlimit
RLIMIT_NPROC 可以为调用进程的真实用户 ID 创建的最大进程数(或更准确地说,在 Linux 上,线程数)。遇到此限制时,fork(2) 将失败并显示错误 EAGAIN。
如您所见,setrlimit
可以对调用进程的用户设置限制。因此它可以通过该用户的调用过程对用户进行限制。
对于您的第二个问题,在某些情况下,内核首先不允许进程超出其限制。在上面的例子中,fork()
在分配更多资源后,它本身失败而不是杀死调用进程。在某些情况下,例如在 CPU 使用率中,当进程超过其 时SOFT_LIMIT
,SIGXCPU
会发送 a。当它超过它时HARD_LIMIT
,SIGKILL
发送