【问题标题】:Python 2.7 is not keeping its ulimits after an exec?Python 2.7 在 exec 之后没有保留它的 ulimit?
【发布时间】:2014-09-15 16:46:14
【问题描述】:

我不明白为什么在执行 exec 时 Python 不保留其 ulimit。我创建了这个小测试用例:

import os
import resource

print "Heap limit:", resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (100, -1))
print "Heap limit:", resource.getrlimit(resource.RLIMIT_DATA)
os.execve("/bin/ls", ["/bin/ls","/etc/passwd"], dict())

我的 Ubuntu 14.04 (Python 2.7.6) 中的输出是:

Heap limit: (-1, -1)
Heap limit: (100, -1)
/etc/passwd

当然,你不能用这么多的虚拟内存执行 ls:

$ sh -c "ulimit -v 100; ls /etc/passwd"
Killed

【问题讨论】:

  • execve 不创建新进程;它只是用新代码替换当前进程中的代码。
  • 谢谢,我想我修正了解释。
  • 我不是很肯定,但我认为,由于进程是在没有限制它可以使用的堆空间的情况下启动的,所以它已经从操作系统获得了足够的内存供ls 成功.也就是说,操作系统不关心进程如何处理它已经拥有的内存,或者尝试将限制设置为小于操作系统当前可用内存的值也可能会失败。
  • 嗯,奇怪,因为 setrlimit 没有失败,但迄今为止最好的解释..(我不知道!)
  • 其实如果改示例启动另一个python脚本,但是执行:x = [1.0]*100000 print x[50000] 就可以了。所以我不认为它只用于已经分配的内存..

标签: python python-2.7 exec ulimit


【解决方案1】:

问题是RLIMIT_DATA is deprecated。现在我们应该使用 RLIMIT_AS。如果您更改脚本以使用它,它将按预期工作。

【讨论】:

    猜你喜欢
    • 2018-07-18
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2014-11-01
    • 2012-04-17
    • 1970-01-01
    • 2015-11-12
    • 2021-09-20
    相关资源
    最近更新 更多