我有一个程序在启动时自动运行,偶尔会导致一个coredump。
我想录制输出,但我似乎无法以编程方式设置ulimit -c
(默认为0,并且每次都重置)。
我尝试过使用bash脚本,以及python的sh
,os.system
和subprocess
,但我无法使用它。
答案 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
命令也可以。