我的进程为什么会被终止?原因是什么?

803

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

最近,一个用户正在执行该应用程序,并且它神秘地死亡。终端上显示出如下文本:

已杀死

这种情况发生了两次。我问过一个不同的终端是否使用kill命令来终止该进程?没有。

在什么条件下,Linux会决定杀死我的进程?我相信shell显示"已杀死",因为进程在收到kill(9)信号后死亡。如果Linux发送kill信号,那么系统日志中应该有一条消息,解释为什么要杀死它吗?


44
Linux杀死了我的进程并将其记录在红帽Linux的/var/log/messages日志中。 - Dean Hiller
2
参见unix.stackexchange.com上的这个答案 - Richard
5
此事件涉及三个角色:(1) 进程,由于一些常见原因导致其占用过多内存并引发OOM条件; (2) 内核,在终止该进程时发送SIGKILL信号(信号9),并在某些系统日志(例如/var/log/messages)中记录此事实;(3) 该进程所在的shell,当从waitpid(2)函数的退出状态指示子进程死亡信号为9时,打印出“Killed”通知的进程。 - arielf
7
阅读@DeanHiller的回答后,我发现Ubuntu系统下的日志信息位于/var/log/syslog目录下。 - Dinei
13个回答

2
我们在客户现场(我想是红帽Linux)遇到了反复出现的问题,即OOMKiller(内存不足杀手)会杀死我们的主要应用程序(即服务器存在的原因)和它的数据库进程。在每种情况下,OOMKiller仅仅认为这些进程使用了太多资源...机器甚至没有因为资源不足而崩溃。该应用程序及其数据库都没有内存泄漏(或任何其他资源泄漏)问题。
我不是Linux专家,但我了解到它的决定何时杀死某些东西以及杀死什么的算法很复杂。此外,据我所知(我不能确定其准确性),OOMKiller被集成到内核中,您无法简单地停止运行它。

1
如果我没记错的话,OOMKiller只会在最后一步才被调用。我想系统甚至会向各种应用程序发送信号,请求它们在被迫调用OOMKiller之前,友好地释放一些资源。请谨慎对待这个说法,因为已经过了很长时间... - rmeador
1
你可以选择不运行它。它已经集成在内核中,但是有选项可以调整其运行方式,甚至可以选择哪些进程更可能被终止。它只会在整个系统没有可用内存时运行,而不是当特定进程使用太多内存时触发。查看我的答案获取更多详细信息。 - Adam Jaskiewicz
6
不运行oomkiller非常容易。echo "2" > /proc/sys/vm/overcommit_memory - R.. GitHub STOP HELPING ICE
Red Hat不允许更改:sudo echo "2" > /proc/sys/vm/overcommit_memory /proc/sys/vm/overcommit_memory:权限被拒绝 - Brent Faust
2
尝试执行命令echo 2 | sudo tee /proc/sys/vm/overcommit_memory - Hypershadsy
@Hypershadsy 在服务器负载高的情况下运行此命令时应注意。或者至少,它给我带来了一些麻烦(SSH断开连接和杀死所有进程)。 - undefined

0
用户有能力使用kill或Control+C来终止自己的程序,但我有一种印象,那不是发生的事情,而是用户向您抱怨。
当然,root有能力杀死程序,但如果有人在您的机器上有root权限并正在终止进程,则会有更大的问题。
如果您不是系统管理员,则系统管理员可能已经设置了CPU、RAM或磁盘使用配额,并自动终止超出配额的进程。
除了这些猜测之外,如果没有关于该程序的更多信息,我就不确定。

7
CTRL-C发送的信号与OP报告的不同(我记得是SIGINT(2),而程序正在接收SIGKILL(9))。 - Powerlord

0

最近我遇到了这个问题。最终,我发现我的进程在自动调用Opensuse zypper更新后被杀死了。禁用zypper更新解决了我的问题。


我遇到了同样的问题。你是如何追踪哪个进程杀死了你的进程的?似乎有一个工具可以检查是谁向进程发送了SIGKILL信号。 - Howy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接