协慌网

登录 贡献 社区

是什么杀死了我的程序,为什么?

我的应用程序在 Linux 上作为后台进程运行。它当前在 “终端” 窗口中的命令行启动。

最近,一个用户执行该应用程序一段时间后,它神秘地死了。文本:

被杀

在航站楼上。这发生了两次。我问其他终端是否有人使用 kill 命令来杀死进程?不。

Linux 在什么情况下会决定终止我的进程?我相信外壳程序显示为 “killed”,因为该进程在收到 kill(9)信号后就死了。如果 Linux 发送了 kill 信号,那么系统日志中是否应该有一条消息说明为什么它被杀死了?

答案

如果用户或 sysadmin 没有杀死内核可能拥有的程序。内核只会在极端的资源匮乏(例如内存 + 交换耗尽)之类的特殊情况下终止进程。

尝试:

dmesg -T| grep -E -i -B100 'killed process'

其中-B100表示杀死之前发生的行数。

在 Mac OS 上省略-T。

这看起来像是一篇有关该主题的好文章:驯服 OOM 杀手

要点是 Linux过量使用内存。当一个进程需要更多的空间时,即使没有其他进程要求它,Linux 也会在没有人实际使用他们所请求的所有内存的情况下为其分配该空间。该进程将在实际使用时而不是在请求时独占使用已分配的内存。这样可以使分配更快,并且可能使您 “作弊” 并分配比实际更多的内存。但是,一旦进程开始使用此内存,Linux 可能会意识到它在分配它没有的内存方面过于慷慨,因此必须终止进程以释放一些内存。要杀死的进程是基于考虑到运行时(长时间运行的进程更安全),内存使用(贪婪的进程不太安全)和其他一些因素(包括您可以调整的值以使进程减少)而获得的分数可能会被杀死。在本文中对此进行了更详细的描述。

编辑:这是另一篇文章,很好地解释了如何选择进程(带有一些内核代码示例的注释)。这样做的好处是,它包括一些有关badness()规则背后的推理的注释。