linux下如何检查与设置程序与服务崩溃时生成coredump文件--包括systemctl启动的服务
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
对于linux下的coredump生成,系统是做了限制的,有soft limit与hard limit,并不是崩溃了就会生成coredump信息。
另外即使限制放开了,也要注意coredump的生成路径,生成路径对于进程来说有没有写入的权限这块。
1. 检查运行程序或服务的 core file 配置(Soft Limit/Hard Limit)
要判断服务崩溃时能否生成 coredump,核心是查看进程的 core file size
限制,可通过 /proc/${pid}/limits
文件直接查询(${pid}
替换为服务进程 ID)。
1.1 操作示例:查询 1 号进程(systemd 主进程)的限制
# 先通过 ps 命令找到目标服务的 PID(以查询 systemd 主进程为例)
[xxx@~/test]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 16:07 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 16:07 ? 00:00:00 [kthreadd]
...# 查看该进程的 core file 限制
[xxx@~/test]$ cat /proc/1/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes # 关键行:软限制为 0(禁止生成),硬限制无上限
Max resident set unlimited unlimited bytes
Max processes 6734 6734 processes
Max open files 1048576 1048576 files
...
1.2 结果解读
- Soft Limit(软限制):进程实际遵循的限制,若为
0
,表示当前禁止生成 coredump; - Hard Limit(硬限制):软限制可提升的最大值,若为
unlimited
,说明允许将软限制调整为无上限。
2. 修改程序或服务的 core file limit 设置
根据程序类型(systemctl
服务 / 普通终端程序),需采用不同的配置方式,核心是将 core file size
的软限制调整为 unlimited
。
2.1 普通终端程序:单次设置或系统全局设置
若需为终端直接运行的程序(非 systemctl
服务)配置 coredump,可通过以下两种方式:
方式 1:单次设置(当前终端有效)
执行 ulimit -c unlimited
,允许当前终端中运行的程序生成无大小限制的 coredump:
# 允许当前终端生成无限制大小的 coredump
ulimit -c unlimited
# 若需限制大小(如 1024KB),可执行:ulimit -c 1024
注意:此设置仅对当前终端生效,关闭终端后失效。
方式 2:系统全局设置(所有用户终端生效)
通过修改 /etc/security/limits.conf
,让所有用户登录终端后默认开启 coredump:
# 编辑配置文件
sudo vim /etc/security/limits.conf# 在文件末尾添加以下两行(* 表示所有用户)
* soft core unlimited # 软限制:无上限
* hard core unlimited # 硬限制:无上限
生效方式:重启系统,或退出当前用户重新登录(无需重启服务,仅对新终端会话生效)。
2.2 systemctl 服务:直接修改服务配置文件(推荐)
systemd
服务默认不继承 /etc/security/limits.conf
的系统配置,必须在服务专属配置文件中显式设置限制,步骤如下:
步骤 1:找到服务配置文件路径
systemd
服务配置文件通常位于两个路径,可通过 systemctl cat [服务名]
快速定位:
- 系统默认服务(如 Nginx、MySQL):
/usr/lib/systemd/system/[服务名].service
- 自定义服务:
/etc/systemd/system/[服务名].service
示例(查找 TestService
的配置文件):
[xxx@~/test]$ systemctl cat TestService
# 输出结果会显示文件路径,如:
# # /usr/lib/systemd/system/TestService.service
[Unit]
Description=Test Service
...
步骤 2:编辑服务配置文件
在 [Service]
段落中添加 LimitCORE=infinity
(表示将 core file 限制设为无上限):
sudo vim /usr/lib/systemd/system/TestService.service
添加内容后如下:
[Unit]
Description=Test Service
After=network.target[Service]
Type=simple
ExecStart=/opt/TestService/TestService # 服务启动命令
LimitCORE=infinity # 关键配置:允许生成无大小限制的 coredump
User=testuser # 服务运行用户(需确保对 coredump 路径有写入权限)[Install]
WantedBy=multi-user.target
步骤 3:重载配置并重启服务
# 重载 systemd 配置(使修改生效)
sudo systemctl daemon-reload
# 重启服务(应用新的限制配置)
sudo systemctl restart TestService
步骤 4:验证修改是否生效
再次查询服务进程的 limits
文件,确认 Max core file size
的软限制已变为 unlimited
:
# 1. 找到重启后服务的 PID
ps -ef | grep TestService
# 2. 查看 core file 限制
cat /proc/${服务PID}/limits | grep "Max core file size"
# 预期输出:Max core file size unlimited unlimited bytes
3. 修改程序或服务的存储位置设置信息
指定 coredump 存储路径和命名规则(避免默认路径混乱):编辑 /etc/sysctl.conf 配置文件,设置 coredump 的生成路径和文件名格式:
## 创建存储目录并授权:确保进程有写入权限
sudo mkdir -p /var/core
sudo chmod 777 /var/core ## 添加以下内容(路径可自定义,如 /var/core/):
sudo vim /etc/sysctl.conf
# 变量说明:
# %e:程序文件名
# %p:进程 ID
# %t:崩溃时间戳(秒级)
# 格式:[路径]/core.[程序名].[进程ID].[时间戳]
kernel.core_pattern = /var/core/core.%e.%p.%t
# 允许非root用户写入coredump路径(若路径权限限制)
kernel.core_uses_pid = 1## 使 sysctl 配置生效:
sudo sysctl -p
4. 验证服务 coredump 生成是否生效
配置完成后,可通过「强制服务崩溃」的方式验证 coredump 是否正常生成:
步骤 1:触发服务崩溃
发送 SIGABRT
信号(信号值 6)给服务进程,强制其崩溃并生成 coredump:
# 1. 找到服务 PID
ps -ef | grep TestService
# 假设输出:testuser 12345 1 0 10:00 ? 00:00:05 /opt/TestService/TestService# 2. 发送 SIGABRT 信号
sudo kill -6 12345
步骤 2:检查 coredump 文件
查看 /var/core
目录,若存在 core.程序名.进程ID.时间戳
格式的文件,说明配置生效:
ls -l /var/core
# 预期输出:
# -rw------- 1 testuser testuser 10485760 Jun 10 10:05 core.TestService.12345.1718000000
5. 总结:
生成 coredump 的核心流程可概括为:
- 开启开关:通过 ulimit命令 或 /etc/security/limits.conf,或者service服务中配置LimitCORE=infinity,允许生成 coredump。
- 配置路径:通过/etc/sysctl.conf中core_pattern自定义存储位置和命名。
- 触发生成:等待程序崩溃、手动发送信号,或配置服务自动生成。
掌握 coredump 生成方法,是定位linux下C/C++等编译型程序底层问题的必要技能。
注:豆包AI参与了文章润色和补充。
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)