【问题标题】:set `ulimit -c` from outside shell从外壳设置`ulimit -c`
【发布时间】:2014-10-18 00:18:48
【问题描述】:

我有一个程序在启动时自动运行,偶尔会导致核心转储。

我想记录输出,但我似乎无法以编程方式设置ulimit -c(默认为 0,每次都会重置)。

我尝试过使用 bash 脚本,以及 python 的 shos.systemsubprocess,但我无法让它工作。

【问题讨论】:

  • 当你尝试 subprocess 时发生了什么?
  • 您是否在程序的启动脚本中添加了ulimit -c

标签: python bash shell ulimit


【解决方案1】:

进程只能为自己及其子进程设置资源限制。它不能为其祖先设置资源限制。通过调用os.system('ulimit -c'),您要求子“ulimit”进程设置祖先“Python”进程的资源限制。

您的 Python 程序可以使用 resource 模块设置其资源限制:

import resource

resource.setrlimit(
    resource.RLIMIT_CORE,
    (resource.RLIM_INFINITY, resource.RLIM_INFINITY))

【讨论】:

  • 太棒了,谢谢!我不知道资源模块。测试并完美运行 :) 现在等待核心转储。
【解决方案2】:

要加入另一个解决方案 - 我在 debian 中使用 limits.conf 全局设置 ulimit:

grep -q -F '* soft core 100000' /etc/security/limits.conf || echo '* soft core 100000' >> /etc/security/limits.conf
grep -q -F 'root hard core 100000' /etc/security/limits.conf || echo 'root hard core 100000' >> /etc/security/limits.conf

这也可以在 python 中使用os.system 命令。

【讨论】:

  • 请注意,对limits.conf 的更改会在您的下一个登录会话开始时生效。
【解决方案3】:

我猜你的问题是你不明白rlimits 是为每个进程设置的。如果您在 Python 中使用 os.system 调用 ulimit,那只会在新生成的 shell 进程中设置 ulimit,然后立即退出,之后没有任何更改。

相反,您需要做的是在启动程序的 shell 中运行 ulimit。然后,您的程序正在运行的进程将从 shell 继承该 rlimit。

我不认为有任何方法可以从进程 Y 更改进程 X 的 rlimit,其中 X != Y。

编辑:我将不得不收回最后一点,至少在你在 Linux 中运行的情况下是这样。有一个特定于 Linux 的系统调用 prlimit 允许您更改不同进程的 rlimits,它似乎也可以在 Python 的 resource 模块中使用,尽管它在那里没有记录。请参阅手册页prlimit(2);我假设 Python 中可用的函数使用相同的参数。

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2013-07-22
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多