如何为退出状态为SEGV的systemd服务启用核心转储生成
解决systemd服务SEGV无法生成核心转储的问题
你已经搞定了普通程序的核心转储,但systemd服务的运行环境和终端会话完全是两回事——你bashrc里的ulimit -c unlimited对systemd管理的服务根本不起作用,因为systemd有自己一套独立的资源限制规则。下面是一步步解决的方法:
1. 为目标服务配置核心转储限制
systemd服务的资源限制需要在服务配置里明确设置,推荐用systemctl edit来添加覆盖配置,这样不会修改原始的服务文件:
- 执行命令打开服务的override配置:
sudo systemctl edit scd.service - 在打开的编辑器中,添加以下内容:
[Service] LimitCORE=infinity - 保存并退出编辑器。
2. 重新加载配置并重启服务
让systemd读取新的配置,然后重启服务使设置生效:
sudo systemctl daemon-reload sudo systemctl restart scd.service
3. 检查全局核心转储配置(可选但推荐)
如果还是没生成核心转储,需要确认systemd-coredump的全局配置是否允许保存转储:
- 编辑
/etc/systemd/coredump.conf文件:sudo nano /etc/systemd/coredump.conf - 找到
Storage选项,确保设置为external或者journal+external(external会把转储保存到/var/lib/systemd/coredump目录,方便后续分析):[Coredump] Storage=external - 保存后重启systemd-coredump服务:
sudo systemctl restart systemd-coredump.service
4. 验证核心转储生成
等服务再次因SEGV崩溃后,执行以下命令查看是否有转储:
coredumpctl list scd # 或者查看详细信息 coredumpctl info scd
补充说明
终端会话的ulimit是shell进程的设置,而systemd服务是由systemd直接启动的,不会继承用户shell的环境变量和资源限制。systemd默认对服务的核心转储大小限制可能是0,所以必须显式在服务配置中开启。
内容的提问来源于stack exchange,提问作者Yashgiri Goswami
相关产品推荐
相关产品推荐

