5

我想要一个监视进程并在以下情况下终止所述进程的“系统”:

  • 该过程超出了一些内存要求
  • 进程在一段时间内没有响应来自“系统”的消息

我认为这个“系统”可能像监控过程一样简单?如何做到这一点的代码示例将很有用。我当然不反对这个问题的完全不同的解决方案。

4

7 回答 7

9

对于第一个要求,您可能需要考虑使用ulimit或调整系统上的内核 OOM-killer 设置。

监控守护进程也存在于这类事情中。 上帝就是一个最近的例子。

于 2008-10-09T15:29:19.713 回答
5

我编写了一个作为 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;
}

https://www.endpointdev.com/blog/2012/08/automatically-kill-process-using-too/

于 2012-08-30T23:24:55.040 回答
4

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

于 2008-10-09T15:28:15.703 回答
1

尝试使用Process Resource Monitor以获得经典的、易于使用的进程监视器。GPL 下可用的代码。

那里还有一些其他的监控脚本,您可能也会觉得有趣。

于 2008-10-22T22:09:38.933 回答
1

如果您想建立一个相当全面的监控系统,请查看monit。有时它可能健谈,但它会进行大量监控、重新启动服务、提醒您等。

也就是说,如果您每天收到数十封电子邮件,请不要感到惊讶,直到您习惯于配置它并告诉它不要让您烦恼的事情。

于 2008-10-22T22:13:42.717 回答
0

受监控的进程是您正在编写的进程,还是只是任何进程?

如果它们是任意进程,那么可能很难监控响应性。除非该流程已设置为处理和响应您可以发送的事件,否则我怀疑您是否能够监控它们。如果它们是您正在编写的进程,则需要添加某种可以使用检查的消息处理。

于 2008-10-09T15:29:30.273 回答
0

我这里有一个 shell 脚本,可以作为你的起点。我这样做是因为我也遇到了一些超出内存限制的进程问题。实际上它只是检查给定的 CPU 使用限制,但您可以轻松更改为监视内存或空闲进程的作业列表。

文件:pkill.sh

#!/bin/bash

if [ -z "$1" ]
  then
    maxlimit=99
else
  maxlimit=$1
fi

ps axo user,%cpu,pid,vsz,rss,uid,gid --sort %cpu,rss\
| awk -v max=$maxlimit '$6 != 0 && $7 != 0 && $2 > max'\
| awk '{print $3}'\
| while read line;\
    do\
      ps u --no-headers -p $line;\
      echo "$(date) - $(ps u --no-headers -p $line)" >> pkill.log;\
      notify-send 'Killing proccess!' $(ps -p $line -o command --no-headers | awk '{print $1}') -u normal -i dialog-warning -t 3000;\
      kill $line;\
  done;

简单地运行一次,如下所示:sh ./pkill.sh <limit-cpu>

或者,为了保持运行:watch -n 10 sh ./pkill.sh 90

在上述情况下,它将每 10 秒运行一次,杀死超过 90% CPU 的进程

于 2021-04-06T14:21:23.603 回答