如何在 unix 上找到没有日志文件的死进程的原因?

Posted

技术标签:

【中文标题】如何在 unix 上找到没有日志文件的死进程的原因?【英文标题】:How to find the reason for a dead process without log file on unix? 【发布时间】:2011-12-16 06:03:49 【问题描述】:

这是一道面试题。

开发人员启动了一个进程。 但是当客户想要使用该流程时,他发现该流程没有运行。 开发者登录后发现进程死掉了。开发人员如何知道出了什么问题?

跟进:应该将日志写入文件的正在运行的进程。但是文件中没有日志。开发人员如何才能弄清楚过程中发生了什么?

我认为: 如果程序可以重新运行,我将使用 gdb 来跟踪进程。 如果不是,请检查进程(应用程序)的输出文件。 或者,将打印添加到代码中。

但是,是否有其他方法可以通过参考操作系统生成的一些信息来做到这一点?

【问题讨论】:

投票结束:您已经给出了解决方案,对于“还有其他方法可以做到吗?”这个问题将没有一个正确的答案。它只能引发广泛的讨论。 【参考方案1】:

如果你有磁盘空间和空闲的 CPU 资源,你可以离开strace 跟随程序来捕捉导致退出的序列。

如果程序没有留下任何痕迹就死了,一个可能的原因是内存不足(OOM) killer。如果它杀死您的进程,这将在内核日志中留下一条消息。

在同一个答案中,process accounting 可以修改为通过告诉您退出代码和退出时间来提供一些线索。

【讨论】:

【参考方案2】:

有时程序不会创建核心转储。在这种情况下,了解软件的退出代码可能会有所帮助。

因此,您可以使用下面的脚本来启动您的软件并记录其退出状态以查找其退出原因。

例子:

#!/bin/bash
./myprogram

#get exit code
exitvalue=$?

#log exit code value to /var/log/messages
logger -s "exit code of my program is " $exitvalue

【讨论】:

【参考方案3】:

...使用像 gdb 这样的调试器...

【讨论】:

OP 已经提到了这一点。你能解释为什么这是唯一的答案吗? 我首先有一个不同的答案,但后来意识到 OP 回答了他自己的问题......我同意他的评估【参考方案4】:

是否有其他方法可以通过参考生成的一些信息来做到这一点 按操作系统?

core dump 是一种选择。

【讨论】:

以上是关于如何在 unix 上找到没有日志文件的死进程的原因?的主要内容,如果未能解决你的问题,请参考以下文章

Unix/Linux 日志记录syslog

在Java中尾随/轮询日志文件的最有效方法[重复]

Unix进程之间的连接,如何获取给定用户名的全名和根目录

如何查看crontab的日志记录

如何查看linux的系统log日志

如何查看linux的系统log日志