同时因为 ftpd 服务没有启动,监控程序也执行了 /root/action1 脚本,因此 root 用户的邮箱中会 收到一封标题为 process status warning!的预警邮件,如下所示:
清单 8. 预警邮件内容
From root@hv4plus_lpar2.ppd.pok.ibm.com Wed Jun 3 09:00:02 2009
X-Original-To: root
Delivered-To: root@hv4plus_lpar2.ppd.pok.ibm.com
Date: Wed, 03 Jun 2009 09:00:02 -0400
To: root@hv4plus_lpar2.ppd.pok.ibm.com
Subject: process status warning!
User-Agent: nail 11.25 7/29/05
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
From: root@hv4plus_lpar2.ppd.pok.ibm.com (root)
process ftpd is not running now
进程性能监控自动化实现
进程在正常工作过程中,会占用一定的 CPU 和内存资源。如果占用过高的 CPU 和内存资源,则有可 能是进程出现异常情况,并且可能会影响其他重要进程的正常运行。因此监控进程性能并在发现异常情况 的时候自动做出反应,例如 kill 掉该进程、修改进程优先级或者发送预警信息给管理员,这将会给系统 管理工作带来很大的帮助。
脚本 CheckProcPerformance 可以实现对进程性能自动化监控的功能,在发现进程 CPU 或者内存资源 超出预定义的阈值时,执行指定的操作。用户还可以根据自己的需求,修改该代码,以实现更加复杂的监 控功能。默认的定义阈值的文件是 /root/ProcAction,该文件也可以通过参数指定。该脚本在 RedHatEL-Server 5.3、SLES 10 SP2 操作系统上测试通过,可以正常执行,使用 perl 的版本为 v5.8.8 。由于该脚本使用 top 命令获取进程性能信息,因此该脚本只适用于 Linux 操作系统,不适用于 AIX 操作系统。
清单 9. /root/CheckProcPerformance 文件内容
#!/usr/bin/perl
use strict;
my $ProcActionFile = $ARGV[0];
if( $ProcActionFile eq "" )
{
$ProcActionFile = "/root/ProcAction";
}
# 获取定义阈值文件的信息
my @ProcActionTable = &GetProcAction($ProcActionFile);
# 获取 top 信息,提取 COMMAND,%CPU,%MEM 三列信息
my %TopInfoTable = &GetTopInfo;
foreach my $line(@ProcActionTable)
{
chomp ($line);
my @ActionLine=split /,/,$line;
my $value;
#$ActionLine[0] 是 Command 名称 ;$value是$ActionLine[0] 进程所对应的CPU%和
#MEM%值
if (defined($TopInfoTable{$ActionLine[0]}))
{
$value = $TopInfoTable{$ActionLine[0]};
}
else
{
next;
}
#$ActionLine[1] 的值是 CPU 的阈值 ; $ActionLine[2] 的值是内存阈值 ;
#$ActionLine[3] 的值是响应脚本的名称
# 如果 CPU% 或者 MEM% 超出阈值文件所定义的 CPU 或者内存阈值,将执行
#$ActionLine[3] 对应的响应脚本
if( $ActionLine[1] < $$value[0] || $ActionLine[2] < $$value[1] )
{
# 将监控进程的名称,CPU 和内存利用率值作为参数传给响应脚本
# 使脚本能提供管理员更详细预警信息
system "$ActionLine[3] $ActionLine[0] $$value[0] $$value[1]";
}
}
# 获取 top 信息,提取 COMMAND,%CPU,%MEM 三列信息,并以 COMMAND 为 key,#[%CPU,% MEM] 为 value,存入 Hash 表中
sub GetTopInfo
{
my @TopInfo = `top -n 1 | awk {'print $13" "$10" "$11'}`;
# 去掉 top 命令所显示的系统摘要信息部分
for( my $i=0; $i<7; $i++ )
{
shift( @TopInfo );
}
my %TopTable;
foreach my $topitem (@TopInfo)
{
my @pair = split /s+/,$topitem;
$TopTable{$pair[0]} = [$pair[1], $pair[2]];
}
return %TopTable;
}
# 获取 ProcAction 信息,将非注释的行存入数组中,
sub GetProcAction
{
my ($file) = @_;
unless(open(TABF, $file)) {
print "Can't open file '$file'.n";
exit 1;
}
my @table;
foreach my $line (<TABF>)
{
chomp($line);
if(!($line =~ /^#/) )
{
push(@table, $line);
}
}
return @table;
close TABF;
} (编辑:云计算网_泰州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|