Я хотел бы понять, что здесь происходит.
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
реально? Это долго работающий демон, который по запросу порождает рабочие потоки и пожинает их, когда нагрузка уменьшается. Я несколько раз заставлял его крутить сервер до смерти. Наиболее важным ограничением, вероятно, является память, которую я сейчас ограничил 200 МБ на процесс, но я хотел бы выяснить, как я могу установить ограничение на количество дочерних элементов (программа позволяет мне настроить максимум, но как я знаю, что в этой части кода нет ошибок?)
Приложение: В более новой системе у меня больше число и немного другое поведение.
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
Ограничению учитываются не только подпроцессы подоболочки, но и все в системе под вашим uid.
Таким образом, если у вас есть 200 процессов, запущенных от вашего имени в любом месте системы, процесс с ulimit -u 205
сможет выполнить форк только до тех пор, пока общее количество не достигнет 205, то есть пять раз (если ничего не выходит).
Так работает ulimit.
Если вы хотите разрешить одному пользователю 4 запущенных процесса,
у вас будет 1 + 4 (один для процесса bash, который в настоящее время использует пользователь)
Из моих тестов,
создал пользовательский тест,
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
Наконец, не рекомендуется использовать ulimit для вашей учетной записи root, 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