#!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(); }
时间: 2024-11-05 04:35:59