Linux 我可以在进程生成核心转储时启动它吗?

Linux 我可以在进程生成核心转储时启动它吗?,linux,Linux,我有一个监控脚本将检查指定的进程,如果它崩溃,脚本将重新启动它,而不等待核心转储写入完成。这会招致不好的事情吗?它会影响核心转储文件或重新启动的进程吗?是的,可以。过程与程序是不同的。由于在unix中可以并行运行多个ls命令实例,因此在保存核心文件时,您可以再次重新启动相同的程序(但不同的新进程)。与编写文件的正常进程的唯一区别在于,编写核心的进程只在内核模式下执行。没有别的了 内核转储由在内核模式下执行的进程执行,作为前一个死亡任务。就进程状态而言,进程处于退出状态,在核心转储完成之前,任何事

我有一个监控脚本将检查指定的进程,如果它崩溃,脚本将重新启动它,而不等待核心转储写入完成。这会招致不好的事情吗?它会影响核心转储文件或重新启动的进程吗?

是的,可以。过程与程序是不同的。由于在unix中可以并行运行多个
ls
命令实例,因此在保存核心文件时,您可以再次重新启动相同的程序(但不同的新进程)。与编写文件的正常进程的唯一区别在于,编写
核心的进程只在内核模式下执行。没有别的了

内核转储由在内核模式下执行的进程执行,作为前一个死亡任务。就进程状态而言,进程处于退出状态,在核心转储完成之前,任何事情都不会影响它(它只能被转储文件中的写入错误中断,或者这可能是一种可中断状态)

您可能遇到的唯一问题是,您启动的下一个实例在尝试写入相同的核心文件名时,将不得不等待它结束(我认为inode仅在每次写入的基础上锁定,而不是锁定整个文件),并且您将得到一堆进程死亡并写入相同的核心文件。如果核心发生在一个新的、不同的文件上(该文件在创建之前已解除链接),则情况并非如此,但这取决于实现。可能攻击应该是DOS攻击,以高速生成核心,使核心文件的写入以非中断状态排队等待许多进程。但我认为这很难实现。。。很可能只有许多进程编写不同的核心文件以便下一步擦除时,您才能获得高负载(这是下一个核心生成任务取消系统调用链接的结果)。

转储非常糟糕,您应该修复其根本原因。这通常是一些意外和未处理的结果(可能是一些内存损坏,等等;也可以阅读UB并对其保持警惕)

如果它崩溃,脚本将重新启动它,而不等待核心转储写入完成

所以你的方法是有缺陷的,除了作为临时措施。顺便说一句,在许多情况下,故障进程的时间足够小,以至于
核心
在很短的时间内被转储。在某些情况下,转储
核心
可能需要几分钟的时间(想想一个大型HPC进程,该进程在一台计算机上处理数百GB的数据)

有传言说,在上个世纪,一些巨大的
核心
文件花了半个小时才被转储到克雷超级计算机上

您确实应该修复您的程序,以避免转储核心

我们根本不知道什么是你的错误程序转储核心。但是如果它有一些您关心的持久状态(例如,在某个数据库或某个文件中),那么您的方法是非常错误的:
core
转储可能发生在产生该状态的代码中,然后,如果您重新启动同一程序,它可能会重用该错误状态

这会招致不好的事情吗

一般来说是的。也许在您的具体情况下不是这样(但我们不知道您的程序在做什么)

因此,您将更好地理解为什么会发生这种情况。一般来说,您将使用所有警告和调试信息(因此
gcc-Wall-Wextra-g
)编译程序,并对内核转储进行事后分析(请参阅)

您确实不应该编写转储核心的程序(即使这种情况发生在我们所有人身上;但这是一个应该尽快修复的严重错误)。而且,您不应该将
core
转储作为可接受的程序行为

core
转储在这里帮助开发人员解决一些严重问题。还可以阅读关于。认为“正常”A是社会上不可接受的,这绝对是一种异常的程序行为。
(有几种方法可以避免
core
转储;但这是一个不同的问题;您需要解释您正在编写和监视的程序类型,以及转储core的原因和方式。)

每个进程都是分开的,因此一般来说,如果一个进程崩溃,另一个进程不会在意。核心转储也不重要。也不是你重新启动崩溃的代码(但是,你应该修复这个bug)。最后,这个问题是离题的,请解释转储核心的实际过程和程序是什么。