我想了解这里发生了什么。
linvx$ ( ulimit -u 123; /bin/echo nst )
nst
linvx$ ( ulimit -u 122; /bin/echo nst )
-bash: fork: Resource temporarily unavailable
Terminated
linvx$ ( ulimit -u 123; /bin/echo one; /bin/echo two; /bin/echo three )
one
two
three
linvx$ ( ulimit -u 123; /bin/echo one & /bin/echo two & /bin/echo three )
-bash: fork: Resource temporarily unavailable
Terminated
one
我推测前 122 个进程由 Bash 本身使用,其余ulimit
进程控制允许我拥有的并发进程数。文档对此不是很清楚。我错过了什么吗?
更重要的是,对于真实世界的部署,我怎么知道哪种ulimit
是现实的?它是一个长期运行的守护进程,按需产生工作线程,并在负载减少时收集它们。我已经让它让服务器死机好几次了。最重要的限制可能是内存,我现在限制为每个进程 200M,但我想弄清楚如何对孩子的数量实施限制(该程序确实允许我配置最大值,但是如何我知道那部分代码没有错误吗?)
附录:在较新的系统上,我得到了更高的数字和略有不同的行为。
xubuntu12.04$ ( ulimit -u 206; /bin/echo nst )
nst
xubuntu12.04$ ( ulimit -u 205; /bin/echo nst )
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: retry: No child processes
bash: fork: Resource temporarily unavailable
Terminated
xubuntu12.04$ bash --version
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
我相信旧系统有 Bash v3。
在dash
中,我得到了不同的行为,尽管仍然不是我期望的行为(并且调用了选项-p
而不是-u
):
xubuntu12.04$ dash
$ ( ulimit -p 1; /bin/echo nst )
nst
$ ( ulimit -p 2; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork
$ ( ulimit -p 208; /bin/echo nst & /bin/echo too & )
dash: 0: Cannot fork
nst
$ ( ulimit -p 209; /bin/echo nst & /bin/echo too & )
nst
too
不仅子 shell 中的子进程会受到限制,而且系统上的所有内容都在您的 uid 下。
因此,如果您在系统的任何地方有 200 个进程以您自己的身份运行,则一个进程
ulimit -u 205
只能分叉,直到总计数达到 205 —— 即五次(如果没有任何退出)。这就是 ulimit 的工作方式。
如果您希望允许一个用户运行 4 个进程,
您将有 1+4 (一个用于用户当前正在使用的 bash 进程)
从我的测试来看,
创建了一个用户测试,
无法运行任何命令,因为 bash 已经是一个正在运行的进程,
只能运行一个进程,例如,
最后,不建议在您的根帐户上使用 ulimit,ulimit 主要用于大型多用户环境。
我希望这有帮助!
干杯,
===============