详细说明

详细说明

出色地..

$ 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
$

总结一下:如果你设置了硬限制,并且想提高它,你在这个壳里运气不好,...除非您保持超级用户身份或随后使用某些咒语来放弃权限。

相关内容