从外壳设置`ulimit -c`

时间:2014-08-24 20:15:06

标签: python bash shell ulimit

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

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

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

3 个答案:

答案 0 :(得分:18)

进程可能只为自己及其子进程设置资源限制。它无法为其祖先设置资源限制。通过致电os.system('ulimit -c'),你问孩子" ulimit"进程设置祖先的资源限制" Python"过程

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

import resource

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

答案 1 :(得分:1)

我猜你的问题是你没有理解每个进程都设置了rlimit。如果你在Python中使用os.system来调用ulimit,那只会在新生成的shell进程中设置ulimit,然后会立即退出,之后没有任何更改。

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

我认为没有办法改变进程X的进程X的rlimit,其中X!= Y.

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

答案 2 :(得分:1)

将另一个解决方案添加到混合中 - 我使用limits.conf在debian中全局设置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命令也可以。