出色地..
$ ulimit -s
8192
$ sudo ulimit -s 16384
$ ulimit -s
8192
为什么ulimit
要用如此野蛮的方式不尊重我?
答案1
ulimit
特定于 shell/进程。跳过sudo
。
$ ulimit -s
8192
$ ulimit -s 16384
$ ulimit -s
16384
答案2
丹尼尔贝克的回答并没有说出全部真相(事实上这是一种花招),并且没有帮助那些真正需要执行“sudo ulimit”的人。
问题是
- ulimit 有软限制和硬限制
- 一旦设置了硬限制,你需要成为超级用户才能将其设置得更高
- sudo 启动一个新的 shell;当你退出它时,你将回到旧的 ulimit!
详细说明
丹尼尔的例子只在非常特殊的情况下才有效(幸运的是,是默认情况)。
反例:
$ ulimit -s 8191 # set both hard and soft limits
$ ulimit -s # show current soft limit
8191
$ ulimit -s 16384 # set both hard and soft limits
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
因此,您使用 来设置限制ulimit -s
,这样就可以设置软限制和硬限制。现在您无法将其设置得更高。
此时,您可能会想尝试sudo
;但由于 Daniel 所写的内容,它不会起作用。
$ sudo ulimit -s 16384 # maybe with sudo?
$ ulimit -s
8191
$
这里发生的事情是sudo
启动了一个新的 shell,并在其中运行ulimit
;在该 shell 中,设置了新的 ulimit。但随后该 shell 完成了其工作,被拆除,现在您又回到了之前的 shell 中,其 ulimit 仍为之前的。
证明:
$ ulimit -s 8191
$ ulimit -s
8191
$ sudo bash
# ulimit -s
8191
# ulimit -s 16384
# ulimit -s # It worked!
16384
# exit
exit
$ ulimit -s # ... but now we're back to the old ulimit.
8191
$
那么 Daniel 的示例究竟为何有效呢?由于 ulimit 默认的硬限制和软限制,他可以将软限制推到硬限制。我们可以慢动作演示一下这个技巧:
$ ulimit -Ss # show the Soft limit
8192
$ ulimit -Hs # show the Hard limit
65532
$ ulimit -s # by default, shows the Soft limit
8192
$ ulimit -s 16384 # set both the Soft and Hard limit
$ ulimit -s # shows the Soft limit
16384
$ ulimit -Hs # but, gotcha! the Hard limit has also been set
16384
$ ulimit -s 16385 # so now we can't go higher
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
$
总结一下:如果你设置了硬限制,并且想提高它,你在这个壳里运气不好,...除非您保持超级用户身份或随后使用某些咒语来放弃权限。