我想了解这里发生了什么。
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
我推测Bash本身使用了前122个进程,剩下的ulimit
pipe理着我允许拥有多less个并发进程。 这个文件不是很清楚。 我错过了什么吗?
更重要的是,对于真实世界的部署,我怎么知道什么样的限制是现实的? 这是一个长期运行的守护进程,它根据需要产生工作线程,并在负载减less时收获它们。 我已经让服务器几次死亡。 最重要的限制可能是内存,我现在每个进程的限制为200M,但我想弄清楚如何强制限制儿童数量(程序允许我configuration最大限度,但是如何我知道这部分代码中没有错误吗?)
附录:在较新的系统上,我得到了更高的数字和稍微不同的行为。
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
,我得到了不同的行为,尽pipe仍然不是我期望的行为(并且选项被称为-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中的subprocess计数的限制,而是在你的uid系统上的一切。
因此,如果你有200个进程在系统上的任何地方运行,一个带ulimit -u 205
的进程将只能分支到总计数达到205–即五次(如果什么都不存在)。
这是ulimit的工作方式。
如果您希望允许一个用户4正在运行进程,
你将有1 + 4(一个是用户正在使用的bash进程)
从我的testing中,
创build了一个用户testing,
ran ulimit -u 1
由于bash已经是一个正在运行的进程,无法运行任何命令,
ran ulimit -u 2
只能运行一个进程,例如,
ps aux -> returned value but ps aux | grep test -> did not return as it's using 2 processes
最后不推荐在您的root账户中使用ulimit,ulimit主要用于大型的多用户环境。
我希望这有帮助!
干杯,
===============
-a All current limits are reported -b The maximum socket buffer size -c The maximum size of core files created -d The maximum size of a process's data segment -e The maximum scheduling priority ("nice") -f The maximum size of files written by the shell and its children -i The maximum number of pending signals -l The maximum size that may be locked into memory -m The maximum resident set size (many systems do not honor this limit) -n The maximum number of open file descriptors (most systems do not allow this value to be set) -p The pipe size in 512-byte blocks (this may not be set) -q The maximum number of bytes in POSIX message queues -r The maximum real-time scheduling priority -s The maximum stack size -t The maximum amount of cpu time in seconds -u The maximum number of processes available to a single user -v The maximum amount of virtual memory available to the shell -x The maximum number of file locks -T The maximum number of threads