Shell脚本实现检测某ip网络畅通情况,实战用例
环境准备,linux shell 发送email 邮件:
1.安装sendmail
yum -y install sendmail
安装好sendmail以后执行以下命令启动sendmail
/etc/init.d/sendmail start
Starting sendmail: [ OK ]
Starting sm-client: [ OK ]
启动以后我们可以执行mail命令测试一下是否能发送邮件
一、通过文件内容发送邮件
mail -s ‘Test mail’ xxx@xxx.com < /etc/passwd
2.使用管道符发送邮件内容,安装mailx
yum install mailx -y
3.安装mutt
yum install mutt
echo -e “服务器异常,请检查” | mutt -s “xxx告警” xxx@xxx.com
邮件一般会被当成垃圾邮件,需要到垃圾箱里面查看,设置为不是垃圾邮件,或者添加白名单(由于不是正常邮箱格式,QQ邮箱添加不了白名单)
——————————
sendmail: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
Error sending message, child exited 127 (Exec error.).
Could not send the message.
============================================
1 #!/bin/bash 2 #################################################################################### 3 #本脚本放于异机,使用定时任务检测192.168.1.12是否网络畅通,如果不通则发邮件告警 4 #为防止频繁收到邮件,对发送邮件做了如下限制: 5 #一小时内只发前三条告警邮件,也就是如果网络一直不通,则每小时内只发前三条邮件。 6 #本脚本只能检测一个ip是否网络断开,可在开始部分加个循环,检测多个ip 7 #################################################################################### 8 #初始化环境变量 9 source /root/.bash_profile 10 #邮件发送列表 11 mail_list='135xxxxxxxx@xx.com,xxx@xxx.com' 12 #ping三次检测的ip 13 ping=`ping -c 3 192.168.1.12|awk 'NR==7 {print $4}'` 14 #如果三次均没ping通,则做以下操作,ping不通可能返回为空,单个[]会报错-eq: unary operator expected,要用双重的 [ ] 15 if [[ $ping -eq 0 ]] 16 then 17 #检查mailinfo文件是否存在,不存在则建立 18 if [ ! -e ./mailinfo ] 19 then 20 touch ./mailinfo 21 fi 22 #获取当前主机时间,用于邮件正文的时间显示 23 now_time=`date` 24 #检查./mailinfo的行数是否为空,如果为空则直接发送邮件 25 row_num=`wc -l ./mailinfo | cut -c 1` 26 if [ $row_num -eq 0 ] 27 then 28 echo "发邮件" 29 echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list 30 #更新最后一次发送时间 31 date +%Y%m%d-%H%M > ./mailinfo 32 echo 1 >> ./mailinfo 33 #如果mailinfo内容不为空,则判断(当前时间减1小时)是否大于上次发送时间,如果是则发邮件 34 else 35 #获取上次发邮件的日期和时间 36 last_date=`head -1 ./mailinfo | cut -c 1-8` 37 last_time=`head -1 ./mailinfo | cut -c 10-13` 38 #获取1小时前的日期和时间 39 current_date=`date +%Y%m%d` 40 current_time=`date +%H%M` 41 #计算当前时间和上次时间差距多久,加10#是为了防止0开头的字符被当成8进制计算 42 let time_diff=10#$current_time-10#$last_time 43 #获取发送次数 44 send_times=`tail -1 ./mailinfo` 45 #以下四种情况发邮件: 46 #当前日期>上次日期,可以发,然后发送计数send_times置为1 47 if [ "$current_date" -gt "$last_date" ] 48 then 49 echo "发邮件" 50 echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list 51 #更新最后一次发送时间 52 date +%Y%m%d-%H%M > ./mailinfo 53 echo 1 >> ./mailinfo 54 fi 55 #当前日期等于上次日期 and 本次时间大于上次时间1小时外,可以发,然后发送计数send_times置为1 56 if [ "$current_date" -eq "$last_date" -a $time_diff -ge 100 ] 57 then 58 echo "发邮件" 59 echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list 60 #更新最后一次发送时间 61 date +%Y%m%d-%H%M > ./mailinfo 62 echo 1 >> ./mailinfo 63 fi 64 #当前日期等于上次日期 and 发送计数send_times置为1,可以发,然后发送次数加1 65 if [ "$current_date" -eq "$last_date" -a $send_times -eq 1 ] 66 then 67 echo "发邮件" 68 echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list 69 #更新最后一次发送时间 70 date +%Y%m%d-%H%M > ./mailinfo 71 echo 2 >> ./mailinfo 72 fi 73 #当前日期等于上次日期 and 发送计数send_times置为2,可以发,然后发送次数加1 74 if [ "$current_date" -eq "$last_date" -a $send_times -eq 2 ] 75 then 76 echo "发邮件" 77 echo -e "1.12网络已断开,请检查 \n\n 告警时间:$now_time" | mutt -s "1.12告警" $mail_list 78 #更新最后一次发送时间 79 date +%Y%m%d-%H%M > ./mailinfo 80 echo 3 >> ./mailinfo 81 fi 82 fi 83 fi
===============================
cd /home
mkdir shell
cd /home/shell/
复制上面内容到服务器上创建文件粘帖(window下保存的文件有编码问题)
vim checkserver.sh
从服务器编辑后sz下载的修改后可以直接上传,复制粘帖反而会成为一行,没有换行了。
————————-
增加执行权限
chmod +x checkserver.sh
————————-
测试脚本执行情况,可以先在文件头部加个echo信息,或者把IP改成ping不通的
./checkserver.sh
————————-
用crontab每5分钟执行一次
crontab -e
*/5 * * * * /home/shell/checkserver.sh
“/tmp/crontab.QIbyUa” 1L, 39C written
crontab: installing new crontab