核心转储时 linux 进程的状态

Status of linux process when core dumping

假设我有一个进程,如果它以某种方式崩溃(例如 mysql),它将生成一个巨大的核心文件。我想知道核心转储时进程的状态是什么。还是和以前一样还是变僵尸了?

我现实生活中的问题是这样的: 我有一个监视器来检查进程的状态。一旦它意识到进程崩溃(通过监视进程的状态),它就会做一些事情。我想确保监视器只在核心转储完成后才做一些事情。这就是为什么我想知道核心转储时的进程状态。

如果您的监视器使用 fork 启动进程,它应该能够获得 SIGCHLD 信号,然后调用 waitpid(2)。 AFAIK waitpid 会在 core 转储完成时告诉您(在此之前不会 return 成功)

另读core(5)

也许在包含 core 转储的目录上使用 inotify(7) 工具可能会有所帮助。

systemd可能也相关(我不知道细节)

顺便说一句,在核心转储时,我相信进程状态(通过 proc(5)/proc/$PID/stat 的 3rd 字段中报告)是

       D  Waiting in uninterruptible disk sleep

因此,如果您担心 core 转储时间过长,您可以例如每半秒循环一次 fopen 然后 fscanf 然后 fclose/proc/$PID/stat伪文件直到状态不再D

最后,如今 核心转储 通常很快(除非您 运行 在具有 1 TB RAM 的超级计算机上)(在 Linux 上一个好的文件系统,如 Ext4 或 BTRFS),因为我相信(如果你有足够的 RAM)核心转储文件保留在 page cache 中。持续半小时的核心转储在上个世纪在当时的超级计算机(Cray)上很常见。

当然你也可以 stat(2) core 文件。

另见 http://www.linuxatemyram.com/