странное поведение с ulimit на Mac OS X 10.6

8

Я получаю очень странное поведение при работе с ulimit. Я просто открываю новую оболочку

Hector:~ robertj$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited 
open files                      (-n) 256 
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 532
virtual memory          (kbytes, -v) unlimited

Хорошо, похоже, что это по умолчанию, даже если я установил ограничение на файлы в /etc/launchd.conf, чтобы оно было неограниченным. Но это другой вопрос для другого дня.

Теперь я увеличил количество файлов до 1024 и снова посмотрю на новые настройки.

 Hector:~ robertj$ ulimit -n 1024
 Hector:~ robertj$ ulimit -a | grep open
 open files                      (-n) 1024

Хорошо, это работает. прохладно! Теперь давайте снова изменим настройки

Hector:~ robertj$ ulimit -n 512
Hector:~ robertj$ ulimit -a | grep open
open files                      (-n) 512

Опять же, это прекрасно работает. Давайте снова изменим на более высокое значение

Hector:~ robertj$ ulimit -n 1024
-bash: ulimit: open files: cannot modify limit: Operation not permitted
Hector:~ robertj$ 

Что за хрень это сейчас?

Если я пытаюсь выполнить sudo, я не получаю сообщение об ошибке, но значение также не изменяется.

Hector:~ robertj$ sudo ulimit -n 1024
Password:
Hector:~ robertj$ ulimit -a | grep open
open files                      (-n) 512
Hector:~ robertj$ 

Что здесь происходит?

Я полностью в тупике!

Любая помощь очень ценится ...

Robertj

robertj
источник

Ответы:

18

Есть две вещи, которые смущают вас. Во-первых, существуют жесткие и мягкие ограничения для каждого ресурса. ulimit -n 512устанавливает оба из них, но ulimit -aпоказывает только мягкий предел. Как только жесткий предел установлен, его можно только уменьшить.

$ ulimit -n
256
$ ulimit -Hn  # There's no initial hard limit
unlimited
$ ulimit -n 512  # This sets both the hard and soft limits
$ ulimit -n
512
$ ulimit -Hn
512
$ ulimit -n 1024  # Once set, the hard limit cannot be increased
-bash: ulimit: open files: cannot modify limit: Operation not permitted

Второе, что вас смущает, это то sudo ulimit, что вы делаете не то, что думаете. Он порождает (корневой) подпроцесс, устанавливает ограничения для открытого файла для этого подпроцесса и затем выходит из подпроцесса. Ограничения являются настройкой для каждого процесса, поэтому изменение в них ничего не даст.

Гордон Дэвиссон
источник
Привет Гордон, спасибо за отличное объяснение. К сожалению, я пока не могу высказать ваш ответ - но это очень помогло!
Итак, если установлен жесткий предел, как мы можем увеличить жесткий предел?
Грег
@greg: я не думаю, что вы можете - это то, что делает это жестким ограничением. В некоторых ОС root может повысить жесткий лимит в других процессах, но я не думаю, что это возможно даже в OS X.
Гордон Дэвиссон,
Благодарю. Я случайно установил его слишком низким, что в значительной степени сделало мою систему непригодной для использования. Перезагрузка, казалось, исправила это.
Грег