从外部设置 `ulimit -c`

8 投票
3 回答
9655 浏览
提问于 2025-04-18 18:23

我有一个程序,它在启动时会自动运行,但偶尔会导致崩溃并生成核心转储文件。

我想记录下输出的内容,但我似乎无法通过程序来设置 ulimit -c(它默认是0,每次都会重置)。

我尝试过用bash脚本,还有Python里的 shos.systemsubprocess,但就是没法成功。

3 个回答

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命令来实现。

2

我猜你遇到的问题是你没有明白rlimit是针对每个进程设置的。如果你在Python中使用os.system来调用ulimit,这只会在新启动的那个shell进程中设置ulimit,而这个进程会马上退出,所以实际上什么都没有改变。

你需要做的是在启动你程序的那个shell中运行ulimit。这样,你的程序运行的进程就会从这个shell中继承到那个rlimit。

我认为没有办法从进程Y去改变进程X的rlimit,前提是X和Y不是同一个进程。

编辑:我得收回最后一句,至少在Linux上是这样。Linux有一个特定的系统调用prlimit,可以让你改变其他进程的rlimits,而且在Python的resource模块中似乎也可以用,虽然那里没有文档说明。你可以查看手册页prlimit(2);我猜Python中的这个函数使用的参数是一样的。

29

一个进程只能为自己和它的子进程设置资源限制,不能为它的父进程设置限制。比如,当你调用 os.system('ulimit -c') 时,其实是在让子进程 "ulimit" 去设置它的父进程 "Python" 的资源限制。

你的Python程序可以通过 resource 模块来设置自己的资源限制:

import resource

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

撰写回答