有什么方法可以检查内核杀死了哪些进程?有时我登录到我的服务器,发现一些本来应该运行整晚的东西在 8 小时后就停止了,我不确定是应用程序在做还是内核在做。
答案1
如果内核杀死了一个进程(因为系统内存不足),将会有一条内核日志消息。签入/var/log/kern.log
(在 Debian/Ubuntu 上,其他发行版可能会将内核日志发送到不同的文件,但通常在/var/log
Linux 下)。
请注意,如果 OOM-killer(内存不足杀手)触发,则意味着您没有足够的虚拟内存。添加更多交换空间(或者更多 RAM)。
一些进程崩溃也会记录在内核日志中(例如分段错误)。
如果进程是从 cron 启动的,您应该会收到一封包含错误消息的邮件。如果进程是从终端中的 shell 启动的,请检查该终端中的错误。运行该进程screen
以在早上再次看到终端。如果 OOM-killer 触发,这可能没有帮助,因为它也可能杀死 cron 或 screen 进程;但如果您遇到了 OOM-killer,那就是您需要解决的问题。
答案2
流程会计可以在这方面提供帮助。
简单来说:
apt-get install acct
然后尝试以下命令:
lastcomm
sa
或者在 Ubuntu 上:
lastcomm -f /var/log/account/pacct
sa /var/log/account/pacct
看:
- http://tldp.org/HOWTO/Process-Accounting/pasetup.html
- http://tldp.org/HOWTO/Process-Accounting/misccommands.html
更新
奇怪的是,该pacct
文件包含有关退出状态的信息,但既没有lastcomm
也sa
似乎没有打印它。
据我所知,您必须编写自己的 C 程序才能访问这些信息。
更新2
这是打印退出代码的版本。
最后两个字段是“S”(表示有信号)和“E”(表示退出),后跟信号编号或退出状态。
因此,就您而言,您可能正在寻找“S 15”,这意味着它有一个 SIGTERM。
sleep X mikel stdin 0.00 secs Fri Mar 25 20:15 S 15
与“E 0”相比,这意味着进程退出且没有错误。
true mikel stdin 0.00 secs Fri Mar 25 20:16 E 0
仅进行了最低限度的测试。
答案3
sudo 服务 --status-all
此命令将告诉您当前正在运行哪些服务以及哪些服务未启动或停止。