从外部设置 `ulimit -c`
我有一个程序,它在启动时会自动运行,但偶尔会导致崩溃并生成核心转储文件。
我想记录下输出的内容,但我似乎无法通过程序来设置 ulimit -c
(它默认是0,每次都会重置)。
我尝试过用bash脚本,还有Python里的 sh
、os.system
和 subprocess
,但就是没法成功。
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))