在最近的项目中需要监控某几台服务器的网卡流量和网桥,写了一个小的perl脚本,当网卡出现异常时,会发送邮件进行通知
#!/usr/bin/perl
# 检测网卡流量,判断链路是否正常,检测网桥是否正常
# 若检测到异常,发送邮件通知
use strict;
use Net::SMTP;
my $timer = 5;
my $login = "ssh user\@addr -p port";
my $cmd1 = "$login cat /proc/net/dev | grep eth1";
my $cmd2 = "$login brctl show br0 | wc -l";
&interface(cmd1, "主机XX故障", "网络接口eth1流量过低 ");
&bridge(cmd2, 2, "主机XX故障", "brctl问题 ");
#bridge(shell_cmd, if_num, mail_head, mail_content)
sub bridge {
my $cmd = $_[0];
my $count = $_[1];
my $head = $_[2];
my $content = $_[3];
my $br = `$cmd`;
if($br != $count)
{
&sendMail();
}
}
#interface(shell_cmd, mail_head, mail_content)
sub interface {
my $cmd = $_[0];
my $head = $_[1];
my $content = $_[2];
my $in_old = `$cmd`;
sleep $timer;
my $in = `$cmd`;
if($in_old =~ m/:\s*(\d+)/) {
$in_old = $1;
}
if($in =~ m/:\s*(\d+)/) {
$in = $1;
}
# Mbps为单位
my $diff = ($in - $in_old) * 8 / 1000 / 1000 / $timer;
if($diff < 10)
{
&sendMail($head, $content);
}
}
#sendMail(header,content)
sub sendMail {
my $mailhost = "smtp.126.com";
my $mailfrom = 'test1@126.com';
my @mailto = ('test2@126.com');
my $subject = $_[0];
my $content = $_[1];
my $smtp = Net::SMTP->new($mailhost, Hello => 'localhost');
# 登录认证
$smtp->auth('test1@126.com','password');
foreach my $mailto (@mailto) {
$smtp->mail($mailfrom);
$smtp->to($mailto);
$smtp->data();
# 邮件头
$smtp->datasend("To: $mailto\n");
$smtp->datasend("From: $mailfrom\n");
$smtp->datasend("Subject: $subject\n");
$smtp->datasend("\n");
# 邮件内容
$smtp->datasend("$content\n\n");
$smtp->dataend();
}
$smtp->quit;
}