Bug 4281 - ulimit -H does not change soft limit
Summary: ulimit -H does not change soft limit
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: bash (show other bugs)
Version: unstable
Hardware: all Linux
: P2 major
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2004-06-02 20:40 MSD by Sergey Vlasov
Modified: 2005-07-13 15:46 MSD (History)
5 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Sergey Vlasov 2004-06-02 20:40:16 MSD
В 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 Dmitry V. Levin 2004-06-02 20:45:33 MSD
Unable to reproduce.
Comment 2 Sergey Vlasov 2004-06-02 21:12:33 MSD
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 Sergey Vlasov 2004-06-02 21:14:24 MSD
Oops- про ulimit -Sv наврал - он работает.
Comment 4 Sergey Vlasov 2004-06-02 21:22:49 MSD
Как оказалось, 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 Dmitry V. Levin 2004-06-02 21:23:49 MSD
Это от ядра не зависит.
Если сначала не выставить -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 Sergey Vlasov 2004-06-02 21:33:49 MSD
Мда... очередной случай несовместимости 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 Dmitry V. Levin 2004-06-02 21:45:36 MSD
Короче говоря, это не ошибка, а просто очередная особенность.
Comment 8 Dmitry V. Levin 2004-06-03 15:32:38 MSD
Я убеждён, что поведение bash логичнее, чем избыточный интеллект zsh.
Все присутствующие в данный момент в офисе со мной в этом согласны.

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

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