了解ulimit -u

我想了解这里发生了什么。

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个进程,剩下的ulimitpipe理着我允许拥有多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