我的应用程序在Linux上作为后台进程运行。它目前在终端窗口的命令行中启动。
最近,一个用户正在执行应用程序一段时间,它神秘地死亡了。文本:
杀了
在终端机上。这样发生了两次。我问是否有人在不同的终端使用kill命令杀死进程?不。
在什么情况下Linux会决定终止我的进程?我相信shell显示“已杀”是因为进程在接收到kill(9)信号后死亡。如果Linux发送了终止信号,系统日志中是否应该有一条消息解释为什么它被终止?
我的应用程序在Linux上作为后台进程运行。它目前在终端窗口的命令行中启动。
最近,一个用户正在执行应用程序一段时间,它神秘地死亡了。文本:
杀了
在终端机上。这样发生了两次。我问是否有人在不同的终端使用kill命令杀死进程?不。
在什么情况下Linux会决定终止我的进程?我相信shell显示“已杀”是因为进程在接收到kill(9)信号后死亡。如果Linux发送了终止信号,系统日志中是否应该有一条消息解释为什么它被终止?
当前回答
用户可以使用kill或Control+C杀死自己的程序,但我的印象是这并没有发生,而且用户向您投诉了。
Root当然有杀死程序的能力,但如果有人在你的机器上安装了Root并杀死了一些东西,你就有更大的问题了。
如果您不是系统管理员,系统管理员可能对CPU、RAM、磁盘使用设置了配额,并且会自动杀死超过配额的进程。
除了这些猜测,没有更多关于这个项目的信息,我不能确定。
其他回答
PAM模块限制资源导致了您所描述的结果:我的进程神秘地死亡,控制台窗口上的文本为Killed。没有日志输出,无论是syslog还是kern.log。顶部程序帮助我发现,在CPU使用一分钟后,我的进程就会被杀死。
我们在客户站点(我认为是Red Hat)的Linux下反复出现问题,OOMKiller(内存不足杀手)杀死了我们的主要应用程序(即服务器存在的原因)和它的数据库进程。
在每种情况下,OOMKiller只是简单地认为进程使用了太多的资源……这台机器甚至还没有因为缺乏资源而崩溃。应用程序及其数据库都没有内存泄漏(或任何其他资源泄漏)问题。
我不是Linux专家,但我认为它的算法决定什么时候杀死什么东西是复杂的。此外,我被告知(我不能说这是准确的),OOMKiller是烘焙到内核,你不能简单地不运行它。
这看起来是一篇关于这个主题的好文章:驯服OOM杀手(1)。
The gist is that Linux overcommits memory. When a process asks for more space, Linux will give it that space, even if it is claimed by another process, under the assumption that nobody actually uses all of the memory they ask for. The process will get exclusive use of the memory it has allocated when it actually uses it, not when it asks for it. This makes allocation quick, and might allow you to "cheat" and allocate more memory than you really have. However, once processes start using this memory, Linux might realize that it has been too generous in allocating memory it doesn't have, and will have to kill off a process to free some up. The process to be killed is based on a score taking into account runtime (long-running processes are safer), memory usage (greedy processes are less safe), and a few other factors, including a value you can adjust to make a process less likely to be killed. It's all described in the article in a lot more detail.
编辑:下面是[另一篇文章](2),它很好地解释了如何选择进程(带有一些内核代码示例的注释)。它的优点在于,它包含了一些关于各种bad()规则背后原因的注释。
我最近遇到了这个问题。最后,我发现我的进程在自动调用Opensuse zypper更新后被杀死了。禁用zypper更新解决了我的问题。
在lsf环境中(交互式或其他),如果应用程序的内存利用率超过了队列上的管理员预先设定的阈值,或者提交给队列的资源请求,那么进程将被杀死,这样其他用户就不会成为潜在运行的受害者。当它这样做时,它并不总是发送电子邮件,这取决于它的设置方式。
在这种情况下,一种解决方案是找到具有更大资源的队列,或者在提交中定义更大的资源需求。
你可能还想复习man ulimit
虽然我不记得导致了死亡,但我需要它已经有一段时间了。