Понимание 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

Я предполагаю, что первые 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

2 ответа

Решение

Ограничение учитывают не только подпроцессы в подоболочке, но и все, что находится в системе под вашим 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 в вашей корневой учетной записи не рекомендуется, 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
Другие вопросы по тегам