#!perl
use warnings;
use strict;
use Net::SMTP_auth;
#&sendMail;
while(1)
{
my ($sumMem, $freeMem, $rateMem);
open MEM, "cat /proc/meminfo |" or die $!;
while(<MEM>)
{
$sumMem = $1 if(/MemTotal:\s+(\d+)\s+kB/);
$freeMem += $1 if(/MemFree:\s+(\d+)\s+kB/);
$freeMem += $1 if(/Buffers:\s+(\d+)\s+kB/);
$freeMem += $1 if(/Cached:\s+(\d+)\s+kB/);
}
$rateMem = sprintf("%d", $freeMem / $sumMem * 100);
if($rateMem <= 10)
{
my $content = &detail;
&sendMail($content);
sleep(3600);
}
sleep(60);
}
sub detail
{
`top -bn 1 > log`;
open LOG, "head -100 log |" or die $!;
my $content;
while(<LOG>)
{
next if(/^$/);
my @top = split /\s+/;
if($top[5] =~ /g|t/ and $top[0] =~ /\d+/)
{
$content .= "$top[1]\t$top[5]\t$top[11]\n";
}
}
return $content;
}
sub sendMail
{
my $content = shift @_;
my $smtpHost = 'smtp.exmail.qq.com';
my $smtpPort = '25';
my $username = '***@genedenovo.com';
my $passowrd = '***';
my @to = ('***', '***');
my $suffix = "\@genedenovo.com";
my $subject = "请注意19服务器内存使用已超过90%!";
my $message = "
Details:
$content
来自$username的监控程序";
my $smtp = Net::SMTP_auth->new($smtpHost, Timeout => 30) or die "Error:连接到$smtpHost失败!";
$smtp->auth('LOGIN', $username, $passowrd) or die("Error:认证失败!");
my @address = map {my $i = $_.$suffix; $i} @to;
my $x = join ", ", @address;
$smtp->mail($username);
$smtp->to(@address);
$smtp->data();
$smtp->datasend("To: $x\n"); # strict format
$smtp->datasend("From: $username\n"); # strict format
$smtp->datasend("Subject: $subject\n"); # strict format
$smtp->datasend("Content-Type:text/plain;charset=UTF-8\n"); # strict format
$smtp->datasend("Content-Trensfer-Encoding:7bit\n\n"); # strict format
$smtp->datasend($message);
$smtp->dataend();
$smtp->quit();
}