我正在开发一个大型 C++ 项目。在测试它时,我经常会从主进程中转储核心。这会产生大量保存在其中的无趣的核心转储,systemd
并且占用有用的磁盘空间。
在 Linux 下运行时是否可以systemd
禁用仅为某个用户临时记录的核心转储,或者仅在某个 tty 或某个 shell 会话中可能更好?
在我看来,如果用户要运行一个经常转储核心的程序并且他不想在没有 root 干预的情况下填充磁盘空间,那么他/她应该可以选择禁用核心转储记录,这似乎是合理的。
答案1
您是否尝试编辑/etc/profile
并添加一行:
ulimit -c 0
对此?如果您不是 root,您可以告诉人们手动运行此命令。
顺便说一句:大多数 Linux 发行版默认将 coredump 限制设置为 0,因此除非您键入,否则在典型的 Lnux 系统上进行调试将不起作用
ulimit -c unlimited
在你的壳里。
该ulimit
命令在内部调用setrlimit()
系统调用,该系统调用在进程中设置由所有子进程继承的设置。任何程序都可以调用setrlimit()
,而不仅仅是 shell。
理论上,任何孩子都可以更改这些设置并创建新的继承系。因此,请确保中间没有调用任何 shell 来再次更改该值。例如,如果调用ulimit
位于 shell 的启动脚本之一中,则可能会发生这种情况。
答案2
接受的答案不适用于systemd-coredump
通过 sysctl 参数中的管道使用的系统kernel.core_pattern
。 (如@textshell 在评论中所述。)在这些情况下,内核在技术上并未写入文件,因此它不遵守核心文件大小限制。
要防止 systemd-coredump 系统上出现 coredump,请将配置文件放入/etc/systemd/coredump.conf.d/no-corefiles.conf
:
[Coredump]
Storage=none
该配置将在下次运行 systemd-coredump 来处理核心时生效。这种方法的一个附带好处是:回溯仍然列在coredumpctl
.