自动杀死进程,占用过多的内存或失速在Linux上

问题描述:

我想监视的过程的“制度”,并会杀死说的过程,如果:自动杀死进程,占用过多的内存或失速在Linux上

  • 过程中超过一定的内存需求
  • 过程不会的时间

一段时间我认为这个“系统”可以作为监控过程一样简单的回复信息从“系统”?如何做到这一点的代码示例会很有用。我当然不会反对这个问题的完全不同的解决方案。

对于第一个要求,你可能要考虑或者使用ulimit,或调整系统上的内核OOM杀手设置。

监视守护进程也存在这种情况。最近的例子是God

要限制的进程的内存使用情况,检查在/etc/security/limits.conf

+0

或`ulimit`(shell)或`setr​​limit`(C)。 – ephemient 2008-10-09 19:03:43

受监视的流程是您正在编写的流程,还是仅仅是任何流程?

如果它们是任意进程,那么可能很难监视响应性。除非这个过程已经被设置来处理和响应你可以发送的事件,否则我怀疑你能够监控它们。如果他们是你正在编写的进程,你需要添加一些你可以使用检查的消息处理。

尝试Process Resource Monitor为经典,易于使用的过程监视器。在GPL下可用的代码。

还有一些其他的监控脚本您可能还会感兴趣。

如果您想建立一个相当全面的监测系统,请查看monit。它可以非常(非常非常非常)健谈有时,但它会做很多监控,重启服务,提醒你等。

这就是说,不要惊讶,如果你得到几十通过电子邮件发送一天,直到您习惯于配置它,并告诉它什么不会让您烦恼。

我写的运行作为一个cron作业,可定制杀有问题的进程脚本:

#!/usr/local/bin/perl 

use strict; 
use warnings; 
use Proc::ProcessTable; 

my $table = Proc::ProcessTable->new; 

for my $process (@{$table->table}) { 
    # skip root processes 
    next if $process->uid == 0 or $process->gid == 0; 

    # skip anything other than Passenger application processes 
    #next unless $process->fname eq 'ruby' and $process->cmndline =~ /\bRails\b/; 

    # skip any using less than 1 GiB 
    next if $process->rss < 1_073_741_824; 

    # document the slaughter 
    (my $cmd = $process->cmndline) =~ s/\s+\z//; 
    print "Killing process: pid=", $process->pid, " uid=", $process->uid, " rss=", $process->rss, " fname=", $process->fname, " cmndline=", $cmd, "\n"; 

    # try first to terminate process politely 
    kill 15, $process->pid; 

    # wait a little, then kill ruthlessly if it's still around 
    sleep 5; 
    kill 9, $process->pid; 
} 

http://blog.endpoint.com/2012/08/automatically-kill-process-using-too.html

+0

Lone链接[被认为是一个不好的答案](http://*.com/faq#deletion),因为它本身毫无意义,并且目标资源不能保证在将来活着。请尽量至少包含您要链接的信息摘要。 – j0k 2012-08-31 07:51:35