我想要一个监视进程的“系统”,并在以下情况下杀死所述进程:
我认为这个“系统”可能像监控过程一样简单吗?如何做到这一点的代码示例将是有用的。我当然不反对这个问题的完全不同的解决方案。
答案 0 :(得分:9)
对于第一个要求,您可能希望查看使用ulimit
或调整系统上的内核OOM杀手设置。
监控守护进程也存在于此类事物中。 God是最近的一个例子。
答案 1 :(得分: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;
}
http://blog.endpoint.com/2012/08/automatically-kill-process-using-too.html
答案 2 :(得分:4)
要限制进程的内存使用情况,请查看/etc/security/limits.conf
答案 3 :(得分:1)
尝试使用Process Resource Monitor来获得经典且易于使用的流程监控器。 GPL下的代码。
还有一些其他监控脚本也可能会让您感兴趣。
答案 4 :(得分:1)
如果您想建立一个相当全面的监控系统,请查看monit。它可能非常(非常非常非常)很健谈,但它会做很多监控,重启服务,提醒你等等。
也就是说,如果你每天收到几十封电子邮件,直到你习惯了它的配置并告诉它什么不会让你感到烦恼,不要感到惊讶。
答案 5 :(得分:0)
您正在编写的受监控流程或任何流程是什么?
如果它们是任意过程,则可能难以监控响应性。除非已经设置过程来处理和响应您可以发送的事件,否则我怀疑您是否能够监控它们。如果它们是您正在编写的进程,则需要添加某种消息处理,以便对其进行检查。
答案 6 :(得分: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 的进程