Ошибка prlimit; 20 процессов недостаточно для bash?

Update:

Похоже, что это зависит от дистрибутива, находятся ли модули в dist-packages или site-packages.

Я нашел этот пост в SO, который может помочь.

debian

python -c "import sys;print(sys.path)"

returns

[(..),'/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', (..)]

Пакеты устанавливаются в /usr/lib/python2.7/dist-packages

centOS

.. returns

[(..), '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages']

Пакеты устанавливаются в обоих каталогах.

5
13.08.2016, 18:02
2 ответа

Вы неправильно поняли, как работает ограничение процесса. prlimit --nproc a.k.a. RLIMIT_NPROC a.k.a. ulimit -u - максимальное количество процессов¹ для пользователя в целом. Если у вас уже запущено 20 процессов и вы установили ограничение на 20, вы не можете создать новый процесс. Важно то, сколько процессов запущено от имени вашего пользователя, неважно, кто их родитель или каковы их ограничения.

Тонкость заключается в том, что хотя ограничение является глобальным, оно применяется только к процессам, в которых оно установлено. Итак, если у вас запущено 18 процессов и вы запускаете prlimit --nproc 20 bash на одном терминале и prlimit --nproc 30 bash на другом терминале, первый bash не сможет создать никаких подпроцессов, но второй может создавать еще несколько, пока их не будет 30 (независимо от того, были ли они запущены из этого bash или нет).

Если вы установите ограничение на 1 для процесса, то этот процесс вообще не сможет разветвляться, но другие процессы все равно могут разветвляться.Если вы установите ограничение на число в сценариях входа в систему, то это число будет применяться к вашим процессам (кроме тех, которые были запущены без чтения сценариев входа в систему, например, из задания cron). Другие случаи могут запутать.

Проще всего описать это с точки зрения реализации. Предел считывается только при выполнении системного вызова fork ¹. Когда процесс вызывает fork , ядро ​​подсчитывает количество R процессов, запущенных от имени одного и того же пользователя. Если предел NPROC вызывающего процесса меньше или равен R , то вызов отклоняется с ошибкой EAGAIN («ресурс временно недоступен», т.е. «попробуйте еще раз»).

В вашем случае у вас, вероятно, уже запущено не менее 20 процессов, а ваш .bashrc запускает несколько подпроцессов (или, скорее, не запускает их, потому что предел процесса был достигнут).

Вы видите два разных сообщения, потому что bash несколько раз пытается выполнить форк при ошибке EAGAIN . В первый раз он отображает сообщение о повторной попытке, и, наконец, он отображает сообщение о том, что он отказался.

¹ Точнее, потоки ядра.
² Этот системный вызов называется clone в Linux.

6
27.01.2020, 20:37

Суть в том, что -nproc устанавливает предел для выполняемых элементов (то есть потоков и процессов и из-за моего раздутого .bashrc требуется более 20 потоков, по крайней мере, это мое предположение, поскольку

после запуска нового bash, подобного этому

$ bash --noprofile --norc

, это стало возможным

bash-4.3$ ulimit -Su 1
bash-4.3$ echo 1
1
bash-4.3# echo 1 &
bash: fork: retry: No child processes

, то есть одного потока было достаточно, вау!

1
27.01.2020, 20:37

Теги

Похожие вопросы