Bug 4281

Summary: ulimit -H does not change soft limit
Product: Sisyphus Reporter: Sergey Vlasov <vsu>
Component: bashAssignee: placeholder <placeholder>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: major    
Priority: P2 CC: glebfm, inger, ldv, placeholder, voins
Version: unstable   
Hardware: all   
OS: Linux   

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.