4

我注意到在 /etc/security/limits.conf 中,限制是基于每个用户(或每个组)配置的,例如:@faculty hard nproc 50

我假设设置限制的是setrlimit,但是setrlimit是在进程的基础上工作的,也就是说,它只在它的调用进程上设置资源限制,所以既然它不能对用户设置限制,那么操作系统如何尊重在limits.conf 中配置的资源限制?

另一个问题,如果某个进程超过了它的资源配额,它会被杀死吗?如果是这样,通过什么信号?谢谢你。

4

3 回答 3

4

正如已经回答的那样,操作系统尊重每个进程的用户限制,而不是每个用户。

如果您希望限制适用于属于用户的所有进程,您可以使用控制 cgroup:

http://en.wikipedia.org/wiki/Cgroups

于 2012-03-19T13:33:13.230 回答
3

您可以为每个用户/组设置硬限制和软限制。为了能够更改自己的限制,进程需要具有特权(root)。当进程试图超过其软限制时会发生什么取决于资源:

  1. 数据限制 -malloc并且new会失败
  2. 打开文件 - 创建文件描述符失败(打开、创建、套接字、接受等)
  3. core - 核心文件将被截断
  4. 文件大小 - SIGXFSZ 被传递给有问题的线程。
  5. stack - SIGSEGV 传递给有问题的线程
  6. 等等

查看setrlimit 手册页以获取更多信息。

在limits.conf 中,您为指定的用户/组分配每个进程的限制。因此,如果您为用户 X 设置了 10MB 的堆栈限制,这意味着使用用户 X 凭据执行的每个进程都设置了 10MB 的堆栈限制。不是描述用户 X 拥有的所有进程的“资源总和”的限制

于 2012-03-19T06:35:35.783 回答
0

man setrlimit

RLIMIT_NPROC 可以为调用进程的真实用户 ID 创建的最大进程数(或更准确地说,在 Linux 上,线程数)。遇到此限制时,fork(2) 将失败并显示错误 EAGAIN。

如您所见,setrlimit可以对调用进程的用户设置限制。因此它可以通过该用户的调用过程对用户进行限制。

对于您的第二个问题,在某些情况下,内核首先不允许进程超出其限制。在上面的例子中,fork()在分配更多资源后,它本身失败而不是杀死调用进程。在某些情况下,例如在 CPU 使用率中,当进程超过其 时SOFT_LIMITSIGXCPU会发送 a。当它超过它时HARD_LIMITSIGKILL发送

于 2012-03-19T06:28:22.813 回答