内核转储时linux进程的状态
假设我有一个进程,如果它以某种方式崩溃,它将生成一个巨大的核心文件(例如mysql)。我想知道当这个过程进行核心转储时,它的状态是什么。是和以前一样还是变成僵尸了 我现实生活中的问题是这样的:内核转储时linux进程的状态,linux,process,coredump,Linux,Process,Coredump,假设我有一个进程,如果它以某种方式崩溃,它将生成一个巨大的核心文件(例如mysql)。我想知道当这个过程进行核心转储时,它的状态是什么。是和以前一样还是变成僵尸了 我现实生活中的问题是这样的: 我有一个监视器来检查进程的状态。一旦它意识到流程崩溃(通过监视流程的状态),它就会做一些事情。我想确保监视器只有在堆芯转储完成后才能执行某些操作。这就是为什么我想知道堆芯转储时的进程状态。如果您的监视器使用fork启动进程,它应该能够获得SIGCHLD信号,然后调用。AFAIKwaitpid将在core转
我有一个监视器来检查进程的状态。一旦它意识到流程崩溃(通过监视流程的状态),它就会做一些事情。我想确保监视器只有在堆芯转储完成后才能执行某些操作。这就是为什么我想知道堆芯转储时的进程状态。如果您的监视器使用
fork
启动进程,它应该能够获得SIGCHLD
信号,然后调用。AFAIKwaitpid
将在core
转储完成时通知您(在此之前不会成功返回)
同时阅读
也许在包含核心
转储的目录中使用工具会有所帮助
可能也是相关的(我不知道细节)
顺便说一句,当堆芯倾倒时,我相信过程状态(通过/proc/$PID/stat
的第三个字段报告)是
因此,如果您关心较长的核心
转储时间,例如,您可以每半秒循环一次到fopen
然后fscanf
然后fclose
该/proc/$PID/stat
伪文件,直到状态不再是D
最后,核心转储通常是很快的(除非你运行在一台有TB内存的超级计算机上)(在Linux上,有一个很好的文件系统,如Ext4或BTRFS),因为我相信(如果你有足够的内存)核心转储文件会保留在内存中。在上个世纪,在当时的超级计算机(Cray)上,持续半小时的内核转储是很常见的
当然,您也可以使用core
文件
另请参见当堆芯被转储时,进程是否真的会终止?监视器会怎么做?它是用
fork
启动进程的吗?@JoachimPileborg假设核心转储需要10分钟,并且在执行此操作时将其状态更改为一些不好的状态。然后,我的监视器可能会认为进程崩溃,并开始对核心文件进行tar。这很简单:如果状态更改为“正在进行核心转储”(我不知道这是否是真实状态),那么您将继续监视进程,当进程终止时,您就知道核心转储已完成。@basilestrynkevitch我认为是这样。我用python编写了它,并使用psutil创建了一个进程。我想它是用叉子的。监视器是一个线程,它使用psutil中的一些库来检查进程的状态。对不起,我认为我没有很好地解释这个问题。监视器不会分叉进程。它只是一个线程,用于检查我感兴趣的进程的状态(但该线程属于该进程的父进程)。看起来您可能对systemd感兴趣(但我不知道详细信息)
D Waiting in uninterruptible disk sleep