在没有 root 的情况下禁用特定用户或 shell 会话的核心转储

在没有 root 的情况下禁用特定用户或 shell 会话的核心转储

我正在开发一个大型 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.

相关内容