每日一道shell练习(04)

1. 习题

设计一个脚本,监控远程的一台主机(假设 ip地址是110.110.110.114)的存活状态,当发现宕机时发一封邮件给你自己。

提示:

  • 你可以使用 ping 命令 :
ping   -c  10 110.110.110.114
  • 脚本可以搞成死循环。

2. 习题分析

其实这中需求并不困难,题目也给出了思路。关键是确定一个阈值,当检测到结果符合阈值,就触发警告,发送警告邮件。

我们可以先在主机上尝试执行一下 ping -c 命令:

[[email protected] work]# ping -c 10 192.168.188.203
PING 192.168.188.203 (192.168.188.203) 56(84) bytes of data.
64 bytes from 192.168.188.203: icmp_seq=1 ttl=128 time=1.53 ms
64 bytes from 192.168.188.203: icmp_seq=2 ttl=128 time=0.469 ms
64 bytes from 192.168.188.203: icmp_seq=3 ttl=128 time=0.632 ms
64 bytes from 192.168.188.203: icmp_seq=4 ttl=128 time=0.562 ms
64 bytes from 192.168.188.203: icmp_seq=5 ttl=128 time=0.785 ms
64 bytes from 192.168.188.203: icmp_seq=6 ttl=128 time=0.591 ms
64 bytes from 192.168.188.203: icmp_seq=7 ttl=128 time=0.569 ms
64 bytes from 192.168.188.203: icmp_seq=8 ttl=128 time=0.604 ms
64 bytes from 192.168.188.203: icmp_seq=9 ttl=128 time=1.19 ms
64 bytes from 192.168.188.203: icmp_seq=10 ttl=128 time=0.643 ms

--- 192.168.188.203 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9010ms
rtt min/avg/max/mdev = 0.469/0.758/1.533/0.321 ms

从输出结果来看,检测主机存活状态就是检测主机能不能ping通。ping命令返回的结果报告中,最重要的就是那个丢包率。当主机宕机断线时,丢包率就会是100%,如果主机正常在线,丢包率就会是0%。实际上,当丢包率大于20%时,网络连接状态就已经出现问题了。

根据以上分析,就可以定下触发警告的阈值是20%。当丢包率大于20%,就可以发邮件了。

接下来,只要能获取到丢包率就可以了。用什么方法呢?看下面的答案脚本。

3. 具体脚本

#!/bin/bash
IP="110.110.110.114"
to_mail="[email protected]"  # 你自己用来接收警告信息的邮箱地址

while true  :
do
result=`ping -c 10 $IP | grep "received" | awk -F‘received, |%‘ ‘{print $2}‘`

if [ -z $result ];then
  echo "script sth wrong."
  exit
elif [ $result -ge 20 ];then

  # 这个python 脚本是用来实现发送邮件功能的,请参考
  python /usr/local/sbin/work/mail.py $to_mail "host down"  "$IP is down"
fi

sleep 30

done

【分析】

  1. 如果你对脚本中的命令: ping -c 10 $IP | grep "received" | awk -F‘received, |%‘ ‘{print $2}‘ ,运行不是很了解,那么你可以按照管道从左至右执行一遍。
  2. 这里有一个awk 的技巧,awk -F选项接分隔符,这个选项的用法非常灵活。例如:-F‘#|:’,表示分隔符既可以是“#”也可以是“:”。

    所以,回到我们的习题中,-F‘received, |%‘,就表示分隔符是“received, ”注意received最后是有一个空格,同时,分隔符也可以是“%”。

  3. 变量 result 存储丢包率。if 条件里,首先判断一下变量是否为空,如果为空则脚本有问题。

    如果变量result 没有问题,且丢包率大于20,则调用 python 脚本发邮件。

    python 脚本参考下面的脚本。

    ?

邮件发送脚本,参考:

[[email protected] work]# cat mail.py
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import os,sys
reload(sys)
sys.setdefaultencoding(‘utf8‘)
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from  subprocess import *
def sendqqmail(username,password,mailfrom,mailto,subject,content):
    gserver = ‘smtp.163.com‘
    gport = 25
    try:
        msg = MIMEText(unicode(content).encode(‘utf-8‘))
        msg[‘from‘] = mailfrom
        msg[‘to‘] = mailto
        msg[‘Reply-To‘] = mailfrom
        msg[‘Subject‘] = subject
        smtp = smtplib.SMTP(gserver, gport)
        smtp.set_debuglevel(0)
        smtp.ehlo()
        smtp.login(username,password)
        smtp.sendmail(mailfrom, mailto, msg.as_string())
        smtp.close()
    except Exception,err:
        print "Send mail failed. Error: %s" % err
def main():
    to=sys.argv[1]
    subject=sys.argv[2]
    content=sys.argv[3]
##定义发送警告信息的邮箱的账号和密码,
##你需要修改成你自己的账号和密码(请不要
##把真实的用户名和密码放到网上公开,否则你会死的很惨),
##我测试用的是163网易的邮箱
    sendqqmail(‘[email protected]‘,‘888888‘,‘[email protected]‘,to,subject,content)
if __name__ == "__main__":
    main()

#####脚本使用说明######
#1. 首先定义好脚本中的邮箱账号和密码
#2. 脚本执行命令为:python mail.py 目标邮箱 "邮件主题" "邮件内容"

【分析】

发送邮件的脚本,使用了python,需要读者自己去扩展学习了解一下。

4. 练习结果

因为 110.110.110.114 是我假设出来的一个ip,所以,肯定ping 不同。

将 shell 脚本后台运行后,就可以在我的 qq 邮箱[email protected] 里收到host 主机宕机的信息了。

5. 结语

今天的练习题需要检测主机状态,然后发邮件通知。功能其实很简单,但是对于新手来说,python 脚本可能是一个难点。写脚本很少有写一次就能100%成功的,所以需要大家多写多练,多调试。

原文地址:http://blog.51cto.com/hellocjq/2097553

时间: 2024-10-11 10:22:35

每日一道shell练习(04)的相关文章

每日一道shell练习(06)——检测端口服务

1. 题目 写一个脚本,判断本机的80端口(假设服务为httpd)是否开启着,如果开启着就什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己.脚本写好后,每分钟执行一次,也可以写一个死循环的脚本,30S检查一次. 2. 习题分析 首先,我们要区分要求,这里的要求是检测80端口是否在监听,而不是检测httpd服务是否运行,虽然两者有一定的联系,但并不是对等的关系.检测端口状态用 netstat -lntp 命令.如果要求检测远程主机的端口状态,则用一下的命令: nmap

每日一道shell脚本练习(01)

0. 引言 准备开一个新坑,每天更新一道shell练习.因为shell脚本属于那种不练习就会生疏,甚至忘记的技能,所以,为了对抗遗忘阻力,我只能不断加强练习了. 1. 第一天练习题目 [题目]请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如今天生成的文件为2018-04-08.log,并且把磁盘的使用情况写到这个文件中,不用考虑cron,仅仅写脚本即可. [分析]第一点,要明白 linux 命令 date 的用法,打印"xxxx-xx-xx"这样的时间格式用date

每日一道shell练习(10)——统计字符数

1. 习题 将下面这句话中字符数在6以内的单词打印出来: Bash also interprets a number of multi-character options . 2. 习题分析 思路:用for循环将每个单词取出,才能单独统计.for循环的分隔符有空格.tab键和回车键,刚好这句话的分隔符是空格键. 3. 脚本 #!/bin/bash line='Bash also interprets a number of multi-character options .' sum=0 for

每日一道shell练习(03)

1 . 习题 写一个脚本计算linux系统所有进程占用内存大小的和 2. 习题分析 2.1.第一个问题,在哪里收集进程的数据 用top或者ps都可以获取每个进程的内存使用大小.获得大小之后,就可以通过一个循环计算它们的和了. 2.2. ps 命令的问题 通过累加 "ps aux" 命令显示的 RSS 列来统计全部进程总共占用的物理内存大小,这是不对的.因为,RSS(resident set size)表示常驻内存的大小,但是由于不同的进程之间会共享内存,所以把所有进程RSS进行累加的方

每日一道shell 练习(05)——批量打包文件

1. 习题 找到 /123 目录下所有后缀名为 .txt 的文件 批量修改.txt 为 .txt.bak 把所有.bak 文件打包压缩为 123.tar.gz 批量还原文件的名字,即把增加的.bak 再删除 2. 习题分析 首先要想办法找出 .txt 结尾的文件,用 find 命令. 打包命令用 tar czvf 就可以搞定了,关键是如何同时将所有 .bak 文件打包. 还原文件名有点复杂,关键是如何找到原来的文件名. 3. 具体脚本 在脚本总已经加进了我的分析,可以看看 [[email pro

每日一道shell练习(09)——sed处理

1. 习题 对一个文件,1至5行删除带有英文的行,6至10行删除里面的英文字符: 2. 分析 这种要求,用sed命令就可以解决了,主要用到匹配替换的知识. 3. 脚本 #!/bin/bash sed -n '1,5p' a.txt | sed '/[a-zA-Z]/d' sed -n '6,10p' a.txt | sed 's/[a-zA-Z]//g' sed -n '11,$p' a.txt 前两个要求,必须使用行号匹配.主要sed是一个流编辑处理器,它是一行一行地接收输入数据,然后再处理.

【转】shell 教程——04 什么时候使用Shell

因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化.因此,Shell脚本只要“用心写”一次,即可应用到很多系统上.因此,之所以要使用Shell脚本是基于: 简单性:Shell是一个高级语言:通过它,你可以简洁地表达复杂的操作. 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行. 开发容易:可以在短时间内完成一个功能强大又妤用的脚本. 但是,考虑到Shell脚本的命令限制和效率问题,下列情况一般不使用Shell: 资源密集型的任务,尤其在

每日回顾Shell —cat,tail,head

Shell中常常会用到cat命令.可是总是不是特别清楚: cat命令的用途是连接文件或标准输入并打印. 这个命令经常使用来显示文件内容.或者将几个文件连接起来显示.或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件]... 2.命令功能: cat主要有三大功能: 1.一次显示整个文件:cat filename 2.从键盘创建一个文件:cat > filename 仅仅能创建新文件,不能编辑已有文件. 3.将几个文件合并为一个文件:cat file1

每日一shell(十)yum安装包for循环检查安装

有时候安装yum包,发现有的已经安装过了但是如果执行安装,yum需要检查源,输出一堆的信息,看起来很烦,于是就想到了先检查后安装,如果本地已经安装,不执行安装,如果没有安装就进行安装. 去重后需要安装的yum安装包如下: autoconf bison bison-devel bzip2 bzip2-devel ca-certificates cairo-devel c-ares c-ares-devel cmake crontabs curl curl-devel diffutils e2fsp