当我从cron运行一些通常是核心的东西时,我怎么还能得到我的核心转储?

时间:2012-09-07 22:07:34

标签: c++ c unix cron coredump

今天我尝试检测核心转储并提醒我的事实上确实遇到了一个错误的断言(当我在前台或后台的命令行上运行它时通常核心转储它)但没有核心是倾倒。我写了这个简单的测试:

int main
{
sleep(3);
assert(false);
}

当我编译并运行时会一直进行核心转储。但是当我把它放在crontab上时,我收到了来自cron守护程序的电子邮件说:

rocket: main.cpp:10: int main(int, char**): Assertion `false' failed.
/bin/sh: line 1: 32448 Aborted                 ./rocket

并且/cores中没有放置任何核心文件。为什么会这样,我怎么能得到我的核心?

1 个答案:

答案 0 :(得分:5)

对于要在崩溃时生成的核心文件,必须在当前环境中启用核心转储。从shell开始,可以使用ulimit来完成:

ulimit -c unlimited

这意味着“将最大核心转储大小设置为无限制”。您的系统可能配置为在交互式shell中执行此操作,但不在cron作业中执行此操作。要从cron作业执行此操作,您需要修改此限制。如果cron作业是调用其他程序的shell脚本,则可以像上面那样调用ulimit。另一方面,如果作业是可执行文件,您可以创建一个包装器来运行它:

#!/bin/bash
ulimit -c unlimited
exec "$@"

另一种选择是使用setrlimit函数修改程序以设置限制本身。

至于为什么你的内核进入/核心而不是工作目录:你的发行版可能已调整core pattern,可能使用程序来处理核心文件并将它们放在/cores.