让我们说我有一个进程,如果它以某种方式崩溃(例如mysql)将产生一个巨大的核心文件。我想知道核心转储时进程的状态是什么。是以前还是改为僵尸?
我的现实生活问题是这样的: 我有一个监视器来检查进程的状态。一旦它意识到进程崩溃(通过监视进程的状态),它就会做一些事情。我想确保监视器只在核心转储完成后才能执行某些操作。这就是为什么我想知道核心转储时的过程状态。
答案 0 :(得分:2)
如果您的监视器正在使用fork
启动进程,则应该能够获得SIGCHLD
信号,然后调用waitpid(2)。 AFAIK waitpid
将告诉您core
转储何时完成(并且在此之前未成功返回)
另请阅读core(5)
也许在包含core
转储的目录上使用inotify(7)工具可能会有帮助。
systemd也可能相关(我不知道细节)
BTW,在核心转储的同时,我认为过程状态(在/proc/$PID/stat
的3 rd 字段中报告通过proc(5)是
D Waiting in uninterruptible disk sleep
因此,如果您担心长core
转储时间,您可以将每半秒循环至fopen
然后fscanf
然后fclose
/proc/$PID/stat
伪文件,直到状态不再是D
最后,核心转储通常是快速的(除非你在具有1TB RAM的超级计算机上运行)这些天(在具有良好文件系统的Linux上,如Ext4或BTRFS),因为我相信(如果你有足够的RAM)核心转储文件保留在page cache。上个世纪,超级计算机(Cray)的核心转储持续半小时很常见。
当然您也可以stat(2) core
文件。