我正在运行 CentOS 5.5 并正在处理服务器应用程序,有时我需要强制进行核心转储,以便查看发生了什么。如果我从 shell 启动服务器并发送 kill SIGABRT,则会创建一个核心文件。如果我从 crontab 启动相同的程序,然后向其发送相同的信号,服务器将被“终止”,但不会生成核心文件。有谁知道这是为什么,需要在我的代码中添加什么或在系统设置中更改什么才能允许生成核心文件?
顺便提一下,
我在 /etc/profile 中将 ulimit 设置为 unlimited
我已经设定
- kernel.core_uses_pid = 1
- kernel.core_pattern=/var/cores/%h-%e-%p.core
在 /etc/sysctl.conf 中
另外,我的服务器应用程序也被添加到 crontab 中,使用与我从 shell 运行它相同的登录 ID。
非常感谢您的帮助
答案1
cron 作业的当前工作目录可能与您预期的不同。请尝试cd /some/writeable/dir && yourdaemon
在 crontab 条目中执行此操作。此外,您通常应使用 init 或 Upstart 或类似程序运行守护进程。请参阅流程管理。
从man 5 core
:
在以下各种情况下都无法生成核心转储文件:
进程没有权限写入核心文件。(默认情况下,核心文件名为 core,创建于当前工作目录中。有关命名的详细信息,请参阅下文。)如果创建核心文件的目录不可写,或者存在同名文件但不可写或不是常规文件(例如,它是一个目录或符号链接),则写入核心文件将失败。
与用于核心转储同名的(可写、常规)文件已存在,但该文件有多个硬链接。
创建核心转储文件的文件系统已满;或者 inode 已用完;或者以只读方式安装;或者用户已达到文件系统的配额。
要创建核心转储文件的目录不存在。
该进程的 RLIMIT_CORE(核心文件大小)或 RLIMIT_FSIZE(文件大小)资源限制设置为零;请参阅 getrlimit(2) 和 shell 的 ulimit 命令的文档(csh(1) 中的限制)。
该进程正在执行的二进制文件未启用读取权限。
该进程正在执行一个 set-user-ID(set-group-ID)程序,该程序由该进程的实际用户(组)ID 以外的用户(组)拥有。(但是,请参阅 prctl(2) PR_SET_DUMPABLE 操作的描述,以及 proc(5) 中 /proc/sys/fs/suid_dumpable 文件的描述。)