核心转储时 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
文件。
假设我有一个进程,如果它以某种方式崩溃(例如 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
文件。