Ubuntu 15.04下Crontab执行程序未生成Core Dump问题排查
解决crontab运行程序不生成core dump的问题
嘿,这个场景我之前碰到过,核心问题在于crontab的执行环境和你直接在终端里的环境差异很大,导致core dump的生成规则或者存储位置不符合你的预期。咱们一步步排查和解决:
1. 先确认crontab环境是否允许生成core dump
终端里你执行ulimit -c可能看到非零值(比如unlimited),但crontab的默认环境里,ulimit -c通常是0,也就是直接禁用了core dump。
验证方法:在crontab里加一条临时任务,输出当前的ulimit配置:
* * * * * ulimit -c >> /tmp/cron_ulimit.log 2>&1等一分钟后查看
/tmp/cron_ulimit.log,如果显示是0,那就是这个问题。解决办法:在crontab的任务脚本开头添加
ulimit -c unlimited,或者直接在crontab行里指定:* * * * * ulimit -c unlimited && /absolute/path/to/your/crashing/program
2. 确认core dump的存储位置
系统的core dump存储路径由kernel.core_pattern控制,终端里可以用cat /proc/sys/kernel/core_pattern查看,但crontab的工作目录和权限可能让你找不到文件:
- 默认情况下,如果
core_pattern是core,那么core文件会生成在crontab的工作目录里(通常是执行crontab的用户主目录,比如/home/your-user),但如果这个目录没有写入权限,就会生成失败。 - 更稳妥的方式是修改core dump的存储路径到一个全局可写的目录,比如
/tmp:- 临时生效:在脚本里添加
echo "/tmp/core_%e_%p" > /proc/sys/kernel/core_pattern(需要root权限) - 永久生效:编辑
/etc/sysctl.conf,添加kernel.core_pattern = /tmp/core_%e_%p,然后执行sysctl -p生效
- 临时生效:在脚本里添加
这样生成的core dump会以core_程序名_进程号的格式存在/tmp里,非常容易找到。
3. 检查crontab的执行用户和权限
- 如果你用的是普通用户的crontab,而core dump的存储目录(比如
/var/crash)需要root权限写入,那肯定生成不了。这种情况下要么换存储目录,要么用root的crontab执行任务。 - 确保你的程序用绝对路径调用,crontab的
PATH环境变量比终端窄很多,用绝对路径能避免找不到程序的问题,比如/home/your-user/bin/your-program而不是your-program。
4. 快速验证方案
写一个极简的测试脚本,放到crontab里验证:
#!/bin/bash # 允许生成core dump ulimit -c unlimited # 切换到/tmp目录,确保有写入权限 cd /tmp # 编译一个会触发空指针的测试程序 cat > test_crash.c << EOF #include <stdio.h> int main() { int *null_ptr = NULL; *null_ptr = 42; // 触发空指针解引用 return 0; } EOF gcc test_crash.c -o test_crash # 运行程序 ./test_crash
给脚本加执行权限chmod +x /tmp/test_crash_script.sh,然后加到crontab里:
* * * * * /tmp/test_crash_script.sh
等一分钟后去/tmp目录下找类似core_test_crash_xxxx的文件,应该就能找到了。
其他可能的排查点
- 检查
/etc/security/limits.conf里是否有针对用户的core 0配置,这会强制禁用core dump。 - 查看系统日志
/var/log/syslog或/var/log/messages,搜索core dump相关的日志,看是否有生成失败的原因(比如权限不足)。
内容的提问来源于stack exchange,提问作者b1tflpr
相关产品推荐
相关产品推荐

