我正在使用 SLES 12.4 VM,其中有一个自定义守护进程经常转储核心,正如我从/var/log/messages
和中看到的那样coredumpctl
。但我从未/var/lib/systemd/coredump/
在任何其他位置看到核心文件。我确实看到一个错误/var/log/messages
:
systemd-coredump[<PID>]: Failed to parse resource limit: <daemon_name>
我已经将核心大小限制设置为无限制/etc/security/limits.conf
。我还启用了应用程序核心转储/etc/systemd/coredump.conf
。但是,当我手动运行时:
[ 12.4 sles ~]# kill -SEGV <daemon PID>
我能够找到核心/var/lib/systemd/coredump
。
/etc/security/limits.conf:
#<domain> <type> <item> <value>
#
* soft core -1
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4
/etc/systemd/coredump.conf:
[Coredump]
Storage=external
Compress=yes
#ProcessSizeMax=5G
#ExternalSizeMax=9G
#JournalSizeMax=767M
#MaxUse=
#KeepFree=
/etc/sysctl.d/50-coredump.conf:
kernel.core_pattern=|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e
极限状态:
[12.4-sles:~]# ulimit -c
unlimited
如何获取内核启动的核心转储的核心?
答案1
看来您的内容不正确,在和字段之间/etc/sysctl.d/50-coredump.conf
应该有一个附加的内容。%c
%t
%e
ulimit -c
您可以看到,在引入了对将周围传递给 systemd-coredump 的支持来决定是保存还是截断 coredump 文件(换句话说,尊重设置ulimit -c
)的更改中。
该更改需要更改kernel.core_pattern
sysctl 的命令行,但您的系统中似乎存在该文件的旧版本。
这可能是由于 RPM 认为需要保留原始文件(查找一个/etc/sysctl.d/50-coredump.conf.rpmnew
或另一个.rpm*
扩展名可能会给您线索。)
无论如何,更新该文件应该可以解决您的问题。
有关导致此问题的根源的更多信息,我查看了您报告的消息:
systemd-coredump[<PID>]: Failed to parse resource limit: <daemon_name>
然后我发现了那条消息在源代码树中,但是该代码期望收到一个可以解析为数字的 RLIMIT ,因此当您提到您在那里收到该消息时<daemon_name>
,令我震惊的是您获得的字段顺序错误......
查看您的50-coredump.conf
并将其与上游树中的树进行比较,很快我就得出结论:您遇到的问题很可能是由于这种不匹配造成的。