Shell脚本Ping监控主机是否存活并发邮件报警(三种方法)

前提已经可以通过mail或mutt客户端发邮件

1. 先安装sendmail来发邮件

# yum -y install sendmail
# /etc/init.d/sendmail start
# chkconfig sendmail on

2.再安装邮件客户端

首先下载最新版本mailx-12.4.tar.bz2

wget http://sourceforge.net/projects/heirloom/files/latest/download?source=files

解压包:

# tar jxvf mailx-12.4.tar.bz2
# cd mailx-12.4
# make
# make install UCBINSTALL=/usr/bin/install

  注意:如果没有卸载旧版本的mailx,是不能直接使用mailx或mail命令的,否则使用的仍然是旧版mailx。

  查看版本号:

#/root/mailx-12.4/mailx  -V

  写入.bashrc

# vi /root/.bashrc
添加一行:alias mail='/root/mailx-12.4/mailx'
# source /root/.bashrc

  这时再执行mail命令即代表新版mailx。 

  接下来配置新版mailx使用外部邮箱发送邮件:

  编辑/etc/nail.rc(注意不是旧版的/etc/mail.rc):

vi /etc/nail.rc  添加两行:

set from=myname@163.com smtp=smtp.163.com

set smtp-auth-user=myname smtp-auth-password=password smtp-auth=login

  第一行指明所使用的外部邮箱及smtp服务器

  第二行指明外部邮箱使用的用户名和密码。
  这里我用的是163邮箱要开启POP3/SMTP服务IMAP/SMTP服务开启后会让你输入授权码,授权码就是这里需要指定的密码
Shell脚本Ping监控主机是否存活并发邮件报警(三种方法)_第1张图片
  保存,并重启sendmail服务

#service sendmail restart

  如果执行报错:

sendmail: unrecognized service

  是因为没有安装sendmail,通过yum安装上就ok

yum install sendmail

  安装成功,继续执行重启sendmail服务步骤

  sendmail启动成功后怎么使用呢?

#echo 'Tset ' | mailx -s "Test test" [email protected]
#echo -e "中文内容测试! " | /root/mailx-12.4/mailx -s "中文标题"  [email protected] 
#echo 'Tset ' 表示内容 
#-s  "Test test" 表示标题
#也可以打印整个文件内容
#cat /home/Tset.log | mailx -s "Test test" [email protected]

方法一、通过加失败计数器来判断(误报率低)

#!/bin/bash
DATE=`date +%F" "%H:%M`
IP=/root/monitor/ip.txt     #ip地址表
MAIL=zhenliang369@163.com
for ip in $(cat $IP | sed '/^#/d')
do
    for ((i=1;i<=3;i++))
    do
        ping -c 1 $ip &>/dev/null
    [ $? -ne 0 ] && let FailCount+=1;
    done
done
[ -z $FailCount ] && FailCount=0  #当ping都正常时,FailCount值为空,就设置FailCount值为0,用整数比较
if [ $FailCount -eq 2 ];then
    #echo "$IP ping is failed."
    echo -e "Date : $DATE\nHost : $ip\nProblem : Ping is failed, Please check ! ! !" | mailx -s "Ping Monitor" $MAIL
fi

#添加任务计划

# crontab -e
*/1 * * * * /root/monitor/ping.sh

方法二、通过ping一个包的状态判断(误报率低,建议此方法)

#!/bin/bash
MAIL="[email protected] [email protected]"
for ip in $(cat ip_list|sed "/^#/d")    #ip_list是当前目录下IP表
  do
     ping -c 1 $ip &>/dev/null            #三个ping有一个能通,说明服务器正常
     a=$?
     sleep 2
     ping -c 1 $ip &>/dev/null
     b=$?
     sleep 2
     ping -c 1 $ip &>/dev/null
     c=$?
     sleep 2
     DATE=$(date +%F" "%H:%M)
     if [ $a -ne 0 -a $b -ne 0 -a $c -ne 0 ];then
         echo -e "Date : $DATE\nHost : $ip\nProblem : Ping is failed." | mailx -s "Ping $ip failed From 255.252" $MAIL
     #else
     #    echo "$ip ping is successful."
     fi
done

方法三、通过丢包率来判断是否正常(误报率高)

#!/bin/bash
while true
do
    DATE=`date +%F" "%H:%M`
    MAIL="[email protected]"
  for ip in $(cat ip_list|sed "/^#/d")       #ip_list是当前目录下IP表 
  do
     num=$(ping -c 2 $ip |grep "100% packet loss" |wc -l)    
     if [ $num == 1 ];then
        echo -e "Date : $DATE\nHost : $i\nProblem : Ping is failed." | mailx -s "Ping $i failed From 255.252" $MAIL
     fi
  done
sleep 30
done

你可能感兴趣的:(Linux)