是否在每个过程中应用limits.conf值?


25

我正在为oracle用户调整nofile值,/etc/security/limits.conf我对其行为有疑问:是否nofile限制了用户可以为其所有进程打开的文件总数,或者是否限制了用户可以拥有的文件总数对每个流程开放?

具体来说,用于以下用途:

oracle                  hard    nofile                  65536

Answers:


23

in limits.conf中的大多数值是可以通过ulimitshell命令或setrlimit系统调用设置的限制。它们是过程的属性。该限制独立适用于每个过程。特别是,每个进程最多可以nofile打开文件。对用户进程累计的打开文件数没有限制。

nproc限制有点特殊情况,因为它确实将用户的所有过程相加。尽管如此,它仍然适用于每个进程:当一个进程调用fork以创建一个新进程时,如果属于该进程euid的进程数大于该进程的RLIMIT_NPROC值,则拒绝该调用。

limits.conf手册页解释说,限制适用于会话。这意味着会话中的所有进程都将具有这些相同的限制(除非被这些进程之一更改)。这并不意味着对会话中的进程进行任何总和(甚至没有操作系统跟踪的内容–会话的概念,但是比它更细粒度,例如每个X11应用程序倾向于结束在自己的会话中)。它的工作方式是,登录进程为自己设置了一些限制,并且所有子进程都继承了这些限制。

¹ 例外,它们在登录过程中应用于拒绝或影响登录。maxloginsmaxsysloginschroot


相反,这是否意味着不同的会话可以具有不同的限制集?
CMCDragonkai 2015年

1
@CMCDragonkai是的,例如,如果limit.conf在打开会话的时间之间进行了更改,或者是否在中设置了不同的限制(除了root,它们必须较小).profile
吉尔斯(Gilles)'所以

1
@laimison如果您遍历所有正在运行的进程并prlimit --pid $pid在每个进程上运行,则可以有效地更改活动会话的限制。请注意,如果要在迭代过程中分叉某些进程,则可能必须执行几次。
吉尔斯(Gilles)“所以,别再邪恶了”

1
@laimison号。假设用户只有两个进程A和B,RLIMIT_NPROC在A中设置为2,在B中设置为3。那么B可以再派生一个进程,但是A不能。
吉尔(Gilles)“所以,别再邪恶了”

1
@laimison如果您在B的父级中将限制设置为2,而在分叉后未在B中更改它,则B的限制为2。如果在B的父级中将限制设置为2,但在B中提高了限制,或者您在B派生前在B的父级中将限制设置为3,在B派生后将其设置为2,则B的限制将设置为3。唯一重要的限制是进程中调用fork()的限制,而不是限制在该进程的父进程或任何其他进程中。
吉尔斯(Gilles)“所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.