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

How can I still get my core dump when I run something from cron which would normally core?

本文关键字:核心 转储 运行 cron 常会      更新时间:2023-10-16

今天,我尝试检测核心转储并提醒我的某个东西实际上遇到了错误断言(当我在前台或后台的命令行上运行它时,通常会进行核心转储),但没有转储任何核心。我写了一个简单的测试:

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

并且从未在CCD_ 1中放置过核心文件。为什么会这样?我该如何获取我的核心?

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

ulimit -c unlimited

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

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

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

至于为什么你的核心放在/cores中,而不是工作目录中:你的发行版可能已经调整了核心模式,可能使用了一个程序来处理核心文件并将它们放在/core中。