每月一次,我发现我的一台 RedHat 9 服务器重新启动(实际上它是 AlmaLinux 9,但由于它是 RH9 的克隆,因此这个问题最好在 RH9 的环境中解决)。我试图找出导致崩溃的原因,但没有创建核心转储文件!
我已经按照这篇文章中的说明进行操作,但我的系统上似乎没有任何内容,但是当我使用以下命令触发核心转储时:
睡眠 3 并杀死 -SEGV $!
没有核心转储文件!
我确认基本设置如下:
[root@myhost ~]# cat /proc/sys/kernel/core_pattern
|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
[root@myhost ~]# ulimit -c
unlimited
我必须设置其他内容才能创建转储文件吗?我怀疑是我自己的应用程序(非打包)导致了这个问题……但即使在保存应用程序的目录中也没有核心文件。
====更新====
我修改了 /etc/coredump.conf 并设置了 storage=external (其他所有内容都注释掉了),然后重新启动并运行以下命令:
[root@myhost ~]# sleep 3 & kill -SEGV $!
[1] 3583
[root@myhost ~]#
[1]+ Segmentation fault (core dumped) sleep 3
[root@myhost ~]# coredumpctl --all
TIME PID UID GID SIG COREFILE EXE SIZE
Sat 2024-10-26 12:56:46 EDT 3583 0 0 SIGSEGV none /usr/bin/bash -
[root@myhost ~]# ll /var/lib/systemd/coredump/
total 0
因此仍然没有可见的核心转储文件(请注意上面的“无”)。系统日志显示:
Oct 26 13:06:41 ngcvls1 systemd[1]: Started Process Core Dump (PID 4459/UID 0).
Oct 26 13:06:41 ngcvls1 systemd-coredump[4460]: Resource limits disable core dumping for process 4458 (bash).
Oct 26 13:06:41 ngcvls1 systemd-coredump[4460]: Process 4458 (bash) of user 0 dumped core.
因此我从命令行运行:
ulimit -c unlimited
并重复段错误测试,然后创建了一个核心文件!但重启后它就消失了。(尽管我在 coredump.conf 中设置了 storage=external)。我需要核心转储才能在重启后继续存在,否则我就不知道我的系统崩溃的原因了。越来越近了!我想让 ulimit -c 永久存在,只是不知道把它放在哪里(不喜欢其他帖子建议把它放在 .bashrc 中)
我在另一个答案中提供了一些信息,但
coredumpctl
没有参数的命令应该列出任何已知的核心转储。此信息保存在 systemd 日志中。如果您删除或不保留日志,您将不会获得此信息。/var/lib/systemd/coredump/
我认为,即使日志已被清除,Systemd 仍会将其核心文件保存在 下。要阻止 systemd 接管核心转储,你可以执行以下操作
第一行覆盖了将来启动时的配置
/usr/lib/sysctl.d/50-coredump.conf
。第二行立即更改了设置。文件中还有其他设置会影响 systemd 是否进行核心转储
请参阅
man coredump.conf
。该文件可能会将默认值显示为注释。条目Storage=external
表示核心文件将位于目录中/var/lib/systemd/coredump/
,否则它们将保存在日志文件中。如果进程大于,
ProcessSizeMax=
则将记录转储,但不进行核心转储。同样,如果ExternalSizeMax=
超过或,则不会进行核心转储JournalSizeMax=
,具体取决于您的存储选择。如果转储已占用超过MaxUse=
磁盘空间的百分比,或者可用KeepFree=
空间不足,则不会进行核心转储。我的 Fedora 38 有对于 RHEL 9,请参阅调试应用程序。