Bug 4281 - ulimit -H does not change soft limit
: ulimit -H does not change soft limit
Status: CLOSED NOTABUG
: Sisyphus
(All bugs in Sisyphus/bash)
: unstable
: all Linux
: P2 major
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2004-06-02 20:40 by
Modified: 2005-07-13 15:46 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2004-06-02 20:40:16
В bash происходит следующее:

$ rpm -q bash
bash-2.05b-alt6

$ uname -r
2.6.6-std26-up-alt5

$ ulimit -Ha
core file size        (blocks, -c) unlimited
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) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) unlimited
cpu time             (seconds, -t) unlimited
max user processes            (-u) 256
virtual memory        (kbytes, -v) unlimited

$ ulimit -H -v 2000000
bash: ulimit: virtual memory: cannot modify limit: Invalid argument

В то же время в zsh этот лимит ставится:

$ ulimit -H -v 2000000
$ ulimit -Ha
cpu time (seconds)         unlimited
file size (blocks)         unlimited
data seg size (kbytes)     unlimited
stack size (kbytes)        unlimited
core file size (blocks)    unlimited
resident set size (kbytes) unlimited
processes                  256
file descriptors           1024
locked-in-memory size (kb) unlimited
address space (kb)         2000000
file locks                 unlimited

Более того, запущенный из этого zsh bash наследует и отображает установленное
значение:

$ bash -c 'ulimit -Ha'
core file size        (blocks, -c) unlimited
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) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) unlimited
cpu time             (seconds, -t) unlimited
max user processes            (-u) 256
virtual memory        (kbytes, -v) 2000000

С ulimit -Sv ситуация аналогичная.
------- Comment #1 From 2004-06-02 20:45:33 -------
Unable to reproduce.
------- Comment #2 From 2004-06-02 21:12:33 -------
strace output for bash:

getrlimit(RLIMIT_AS, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
getrlimit(RLIMIT_AS, {rlim_cur=RLIM_INFINITY, rlim_max=RLIM_INFINITY}) = 0
setrlimit(RLIMIT_AS, {rlim_cur=RLIM_INFINITY, rlim_max=2000000*1024}) = -1
EINVAL (Invalid argument)
open("/usr/share/locale/ru_RU.KOI8-R/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT
(No such file or directory)
open("/usr/share/locale/ru_RU.koi8r/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT
(No such file or directory)
open("/usr/share/locale/ru_RU/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No
such file or directory)
open("/usr/share/locale/ru.KOI8-R/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT
(No such file or directory)
open("/usr/share/locale/ru.koi8r/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No
such file or directory)
open("/usr/share/locale/ru/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such
file or directory)
write(2, "sh: line 1: ulimit: virtual memo"..., 74sh: line 1: ulimit: virtual
memory: cannot modify limit: Invalid argument
) = 74
exit_group(1)                           = ?

strace output for zsh:
setrlimit(RLIMIT_AS, {rlim_cur=2000000*1024, rlim_max=2000000*1024}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [CHLD], [CHLD], 8) = 0
getpid()                                = 23961
exit_group(0)                           = ?
------- Comment #3 From 2004-06-02 21:14:24 -------
Oops- про ulimit -Sv наврал - он работает.
------- Comment #4 From 2004-06-02 21:22:49 -------
Как оказалось, 2.4.26-std-smp-alt2 ведёт себя точно так же:

$ ulimit -Hv 500000 
-bash: ulimit: virtual memory: cannot modify limit: Invalid argument

strace:
setrlimit(RLIMIT_AS, {rlim_cur=1048576*1024, rlim_max=500000*1024}) = -1 EINVAL
(Invalid argument)

Судя по http://www.opengroup.org/onlinepubs/007908799/xsh/getrlimit.html, ядро
в
данном случае ведёт себя правильно:

The getrlimit() and setrlimit() functions will fail if:

[EINVAL]
    An invalid resource was specified; or in a setrlimit() call, the new
rlim_cur exceeds the new rlim_max.
------- Comment #5 From 2004-06-02 21:23:49 -------
Это от ядра не зависит.
Если сначала не выставить -Sv, то -Hv не сработает.

Вопрос в том, что должна делать команда ulimit c soft limit'ом при установке hard
limit'а, и должна ли вообще?

См. тж.:
$ ulimit -Sv 262144
$ ulimit -Hv 262144
$ ulimit -Hv 262143
bash: ulimit: virtual memory: cannot modify limit: Invalid argument
------- Comment #6 From 2004-06-02 21:33:49 -------
Мда... очередной случай несовместимости shell-ов.

bash:
   If neither -H nor -S is specified, both the soft and hard limits are set.

zsh:
   By default, only soft limits are manipulated.
------- Comment #7 From 2004-06-02 21:45:36 -------
Короче говоря, это не ошибка, а просто очередная особенность.
------- Comment #8 From 2004-06-03 15:32:38 -------
Я убеждён, что поведение bash логичнее, чем избыточный интеллект zsh.
Все присутствующие в данный момент в офисе со мной в этом согласны.

Если надо установить оба лимита сразу, есть "ulimit -SH".

Неплохо бы повесить PR на zsh.