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 主进程)的限制
shell 复制代码
# 先通过 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:

shell 复制代码
# 允许当前终端生成无限制大小的 coredump
ulimit -c unlimited
# 若需限制大小(如 1024KB),可执行:ulimit -c 1024

注意:此设置仅对当前终端生效,关闭终端后失效。

方式 2:系统全局设置(所有用户终端生效)

通过修改 /etc/security/limits.conf,让所有用户登录终端后默认开启 coredump:

shell 复制代码
# 编辑配置文件
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 的配置文件):

shell 复制代码
[xxx@~/test]$ systemctl cat TestService
# 输出结果会显示文件路径,如:
# # /usr/lib/systemd/system/TestService.service
[Unit]
Description=Test Service
...
步骤 2:编辑服务配置文件

[Service] 段落中添加 LimitCORE=infinity(表示将 core file 限制设为无上限):

shell 复制代码
sudo vim /usr/lib/systemd/system/TestService.service

添加内容后如下:

ini 复制代码
[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:重载配置并重启服务
shell 复制代码
# 重载 systemd 配置(使修改生效)
sudo systemctl daemon-reload
# 重启服务(应用新的限制配置)
sudo systemctl restart TestService
步骤 4:验证修改是否生效

再次查询服务进程的 limits 文件,确认 Max core file size 的软限制已变为 unlimited

shell 复制代码
# 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 的生成路径和文件名格式:

shell 复制代码
## 创建存储目录并授权:确保进程有写入权限
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:

shell 复制代码
# 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.时间戳 格式的文件,说明配置生效:

shell 复制代码
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)

相关推荐
小狗爱吃黄桃罐头3 小时前
正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统
linux·驱动开发·学习
小心草里有鬼3 小时前
Linux 数据库 Mysql8 主从复制
linux·运维·数据库·sql·mysql
czhc11400756633 小时前
Linux925 shell 变量:本地、环境变量、全局变量;数组:普通数组、关联数组;交互定义、basename、dirname
linux·交互
chen_note3 小时前
Keepalived两个集群实验
linux·服务器·数据库·keepalived·高可用集群
Akshsjsjenjd3 小时前
HAProxy 使用指南:从基础到实战部署
linux·负载均衡
東雪蓮☆4 小时前
ELK 企业级日志分析系统实战教程
linux·运维·elk
泽虞5 小时前
《C++程序设计》笔记p4
linux·开发语言·c++·笔记·算法
什么半岛铁盒5 小时前
C++项目:仿muduo库高并发服务器--------Any类的实现
linux·服务器·数据库·c++·mysql·github
吃不胖没烦恼5 小时前
Alibaba Cloud Linux 3 +Docker 部署 ThinkPHP6 (宝塔环境)
linux·运维·docker