直接改/proc/sys/kernel/core_pattern不生效,是因为路径必须为绝对路径、父目录需预先创建且权限必须为1777,systemd服务还需单独配置limitcore=infinity,且fs.suid_dumpable=2须启用。

直接改 /proc/sys/kernel/core_pattern 不生效?不是命令错了,是内核根本没权限写进你指定的目录,或者目录压根不存在。
core_pattern 路径必须是绝对路径,且父目录已存在并设对权限
内核只负责把数据写进去,不帮你创建目录树。比如你想写到 /var/crash/core.%e.%p.%t,但 /var/crash 不存在,那崩溃时 core 就会静默丢弃。
- 先手动创建:
sudo mkdir -p /var/crash - 权限必须是
1777(sticky + world-writable):sudo chmod 1777 /var/crash—— 少一个7或写成755都会拒绝写入 -
core_pattern中不能含~、$HOME、相对路径(如../core),只认纯绝对路径
systemd 服务必须单独配 LimitCORE=infinity
你在终端里执行 ulimit -c unlimited 没用——systemd 启动的服务完全不继承这个设置。哪怕 /proc/sys/kernel/core_pattern 和全局 ulimit 都对了,服务一崩溃照样没 core。
- 编辑对应 unit 文件,例如
/etc/systemd/system/myapp.service - 在
[Service]段下加一行:LimitCORE=infinity(注意:不是unlimited) - 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart myapp - 验证是否生效:
systemctl show myapp | grep LimitCORE,输出应为LimitCORE=18446744073709551615
永久生效要改两个配置文件
临时改 /proc/sys/kernel/core_pattern 重启就失效。生产环境必须落盘。
- 写入
/etc/sysctl.conf:echo "kernel.core_pattern=/var/crash/core.%e.%p.%t" | sudo tee -a /etc/sysctl.conf - 刷新:
sudo sysctl -p - 同时确保
fs.suid_dumpable = 2已启用(尤其对 setuid 程序),否则它们默认不生成 core
常见错误现象和验证方式
改完之后仍没 core?别急着重试,先看这几个关键点:
- 用
cat /proc/sys/kernel/core_pattern确认值已更新,且不含空格或非法字符 - 运行一个必崩程序测试:
kill -SEGV $$(在当前 shell 中触发段错误),看是否真生成了文件 - 检查
dmesg | tail,如果看到coredump: failed to write或permission denied,基本就是目录权限或路径问题 - 确认进程实际工作目录不影响路径解析 ——
core_pattern是绝对路径时,它完全不依赖进程 cwd
最常被忽略的是:目录存在 ≠ 权限正确;配置写对了 ≠ systemd 服务读到了;ulimit -c unlimited 生效 ≠ 服务进程也生效。三个环节缺一不可。











