Unix(或Linux)中是否有一种机制可以阻止正在进行的核心转储?


15

假设一个(非常大的)进程正在崩溃并转储核心,并且我们从其他信息(可能是断言消息,也许还有其他信息)中知道了原因。

有没有办法阻止核心转储完全生成,因为在这种情况下这很浪费?

例如,杀死-9的核心转储过程会中断corefile的生成吗?

显然,如果我们提前知道我们不希望进行核心转储,则可以适当地设置ulimit或使用操作系统的各种核心文件控制实用程序。

但是这个问题是关于“核心转储已经在进行中”的阶段。

(例如,假设我是/programming/18368242/how-to-bypass-a-2tb-core-dump-file-system-limit的请求者, 不想浪费5 -6 TB磁盘空间:))


在Linux上,您可以禁止生成核心转储...这是一个选择吗?
krisFR 2014年

否-核心转储通常是必需的,但是我们只是在寻找一种方法来停止它们,而这些情况我们知道问题出在不需要核心的情况下,从而节省了时间/磁盘空间/等。当然,一旦完成转储(甚至在此之前取消链接),我们就可以删除核心,但是如果我们可以更早地终止核心转储,则没有理由占用磁盘上的几GB空间。
Mike G.

满足特定条件时,可以在调用程序的脚本中使用“ cat / dev / null> <path_to_core>”,因此,只要存在/ proc / <pid>条目,请每隔几秒钟睡眠一次并运行/将dev / null复制到核心文件。这将使它归零。我不确定问题背后的全部内容,但这可以奏效。
2014年

Schrute,与取消链接的核心具有相同的效果,不是吗?在核心完成写入之前,磁盘空间和系统资源仍将被消耗-在du或ls中看不到文件大小。
Mike G.

资源是的,但是这是处理大型文件(例如核心/日志文件)而不停止PID的常用方法。这仅取决于目标是什么。
Schrute 2014年

Answers:


8

通常:没有,没有办法可靠地杀死核心转储。

话虽这么说,但商业上可能存在(至少在Linux中)* NIX的可能性

可能是因为内核的3.x系列能够中断文件写入。一种可能性是找到正在执行转储的线程,并重复向其发送SIGKILL直到成功。

修补程序系列在某种程度上解决了该问题。

其他可能性是对coredump_pattern使用备用语法。该手册说,自2.6.19起,您可以使用管道和程序(带有参数)代替模式来处理转储。因此,您将控制将哪个转储写入到哪里(/ dev / null是您无用的内核的明显候选者)。

这个补丁也值得引起注意:http : //linux.derkeiler.com/Mailing-Lists/Kernel/2010-06/msg00918.html


谢谢zeridon-绝对是目前为止最好的答案。
Mike G.

我认为,如果您使用管道系统的机制,并且知道不想要保留的内容,则可以不读取管道数据就退出(除非管道破裂会导致另一个问题……需要进行测试。)
Alexis Wilke


-1

看起来您可以运行ulimit -c(假设您正在使用bash)来限制核心转储大小。

参见:https : //askubuntu.com/questions/220905/how-to-remove-limit-on-core-dump-file-size

http://ss64.com/bash/ulimit.html


1
正如我在OP中所说的那样,Kerry:“显然,如果我们提前知道我们不希望进行核心转储,我们可以适当地设置ulimit或使用操作系统的各种核心文件控制实用程序。” 我正在尝试查看是否已经有一种方法可以停止核心转储,因为它已经开始执行非常大的任务(以节省时间/磁盘空间/资源)。
Mike G.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.