如果我在 shell 中执行“ps”命令,我可以获得标记为“”的某些进程 - 它们已退出,但父进程尚未收到它们的退出状态。有时,在调试网络应用程序时,我需要从 shell 获取此类进程的退出状态 - 它是 0 还是某些错误代码(如分段错误)?
是否有可能从给定的 shell 获取此退出状态PID
,或者只有僵尸的父进程可以获得此退出状态?
PS 我不需要“杀死”它们,“关闭”它们等等。我只需要检查它们的退出状态:)
答案1
僵尸进程的定义是一个完成执行的进程,但它仍有其退出状态要报告给它的父进程(显然已经不存在了),因此,内核会将其保留在进程表中,它不再被安排进一步执行,但不能被删除,也不允许重新使用 PID,直到确定退出状态不再需要。
因此,根据此定义,如果您“收到”退出代码,则您完全解决了僵尸进程。您需要一个可以访问内核结构的内核模块。通常只有父进程或 init 可以从 waitpid() 读取值,但我记得在较新的内核中,有一种方法可以让进程“控制器”取代 init,即它们将收养这样的子进程,因此如果您不介意杀死父进程……这也是一种可行的方法。
我查看了 /proc 以查看是否可以从那里挖掘出某些东西,但由于退出代码的性质,它不会在那里显示......
答案2
/proc/pid/stat
退出代码可用5b172087f99189416d5f47fd7ab5e6fb762a9ba3,当这个问题被问到时,它可能太新了......:)
现在您可以从 中的最后一个数字获取退出代码/proc/pid/stat
。