I'd like to understand what's going on here.
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
I speculate that the first 122 processes are consumed by Bash itself, and that the remaining
ulimit governs how many concurrent processes I am allowed to have. The documentation is not very clear on this. Am I missing something?
More importantly, for a real-world deployment, how can I know what sort of
ulimit is realistic? It's a long-running daemon which spawns worker threads on demand, and reaps them when the load decreases. I've had it spin the server to its death a few times. The most important limit is probably memory, which I have now limited to 200M per process, but I'd like to figure out how I can enforce a limit on the number of children (the program does allow me to configure a maximum, but how do I know there are no bugs in that part of the code?)
Addendum: On a newer system, I get a higher number and slightly different behavior.
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.
The older system had Bash v3 I believe.
dash, I get different behavior, albeit still not the behavior I expect (and the option is called
-p instead of
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