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

1. 题目

写一个脚本,判断本机的80端口(假设服务为httpd)是否开启着,如果开启着就什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己。脚本写好后,每分钟执行一次,也可以写一个死循环的脚本,30S检查一次。

2. 习题分析

  • 首先,我们要区分要求,这里的要求是检测80端口是否在监听,而不是检测httpd服务是否运行,虽然两者有一定的联系,但并不是对等的关系。检测端口状态用 netstat -lntp 命令。如果要求检测远程主机的端口状态,则用一下的命令:

    nmap  -p 80  host_remote_ip  ## 替换成远程主机的ip就可以了
    例如:
    [[email protected] ~]# nmap -p 80 192.168.188.107
    
    Starting Nmap 6.40 ( http://nmap.org ) at 2018-05-03 11:48 CST
    Nmap scan report for cenvm71 (192.168.188.107)
    Host is up (0.00021s latency).
    PORT   STATE  SERVICE
    80/tcp closed http
    MAC Address: 00:0C:29:E4:4D:1F (VMware)
    
    Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds
    
  • 如果httpd服务没有启动,则启动。启动的方法当然是你自己知道apache的启动命令的。
  • 最后,关于发邮件的方法,在我的博客《每日一道shell练习(04)》里面的mail.py 脚本可以继续使用。使用方法,可以去翻翻文章。

3. 检测脚本

[[email protected] work]# cat check_80.sh
#!/bin/bash

ma="[email protected]"

if netstat -lntp | grep -q ‘:80 ‘
then
  exit 0
fi
/usr/local/apache2.4/bin/apachectl restart >/dev/null 2> /dev/null
python /usr/local/sbin/work/mail.py $ma "port_80" "prot 80 down"

n=`pgrep -l httpd | wc -l`
echo $n
if [ $n -eq 0 ];then
  /usr/local/apache2.4/bin/apachectl start 2> /tmp/http.error
fi

if [ -s /tmp/http.error ]
then
  python /usr/local/sbin/work/mail.py $ma "apache_restart_wrong" "`cat /tmp/http.error`"
fi

脚本分析:

  1. if 条件的判断可以是一条命令,当命令执行成功条件成立。例如:

    [[email protected] work]# ls /etc/passwd
    /etc/passwd
    [[email protected] work]# ls /etc/okama
    ls: cannot access /etc/okama: No such file or directory
    

    第一条命令没有出错,第二条命令出错了。如果将他们作为if 的判断条件,效果如下:

    # if ls /etc/passwd >/dev/null 2>/dev/null ; then echo ok;fi
    ok
    # if ls /etc/okma >/dev/null 2>/dev/null ; then echo ok;else  echo error; fi
    error
    

    ">/dev/null 2>/dev/null"这个是为了让判断安静进行,将多余的信息重定向,然后,我们的if 命令只判断返回的状态码。

  2. 第二点要注意的是,netstat -lnpt | grep -q ‘:80 ‘,是用来判断系统的80端口是否在监听,而且在‘:80 ‘最后还有一个空格,这个也是为了匹配准确。因为有可能会匹配到8080端口。

    grep -q 仅仅进行匹配,不会将结果打印出来,用在 if 判断,效果正好,不用加 ">/dev/null 2>/dev/null";

  3. 按照要求,如果80端口没有启动,我们就要启动httpd服务。启动服务之后,我们还应该检测一下httpd服务是否已经真的启动成功了。方法很简单,就是检测一下httpd进程是否存在。
  4. pgrep -l httpd 命令,除了会列出httpd 的pid外,还会将进程名称一起列出来
  5. 如果httpd 没有正常启动,那么就将错误信息输出到一个文件。然后,在发送警告邮件的时候,将错误信息作为邮件内容,发送。

4. 结语

这道习题并不困难,但是有一些可以琢磨的地方,让大家不断精进。例如if 条件的灵活运用,pgrep的运用,还有邮件脚本的结合运用等等。

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

时间: 2024-08-29 18:00:25

每日一道shell练习(06)——检测端口服务的相关文章

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

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

每日一道shell练习(04)

1. 习题 设计一个脚本,监控远程的一台主机(假设 ip地址是110.110.110.114)的存活状态,当发现宕机时发一封邮件给你自己. 提示: 你可以使用 ping 命令 : ping -c 10 110.110.110.114 脚本可以搞成死循环. 2. 习题分析 其实这中需求并不困难,题目也给出了思路.关键是确定一个阈值,当检测到结果符合阈值,就触发警告,发送警告邮件. 我们可以先在主机上尝试执行一下 ping -c 命令: [[email protected] work]# ping

每日一道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是一个流编辑处理器,它是一行一行地接收输入数据,然后再处理.

nc检测端口是否正常服务的一个命令

最近碰到一个项目,前端用apache htttpd进行发布(80端口),通过双机负载均衡转发到后端的两个tomcat进行处理(8081和8082端口),现在需要随时监控这三个端口的情况,一旦down掉需要能够立即告警处理.批量的系统监控比较好的是用nagios软件来实现,这样小项目专门装一个nagios软件,有点繁琐了.在网上查了一些资料,总结实验了一下,可以用简单的nc命令来实现. 一.nc命令检测端口的用法 # nc  -v  -w 10 %IP%   -z  %PORT% -v  显示指令

1、微服务--为什么有consul,consul注册,心跳检测,服务发现

一.为什么有consul? 在微服务,每1个服务都是集群式的,订单服务在10台服务器上都有,那么用户的请求到达,获取哪台服务器的订单服务呢?如果10台中的有的订单服务挂了怎么办?10台服务器扛不住了,水平扩展又新增加了1台服务器提供订单服务,怎么让用户请求知道有新的服务器提供服务了?这时候就需要Consul了,它能通过心跳检测哪些服务还活着,而且有新的服务启动,它也能主动发现 二.consul环境准备 1.consul环境 consul官网:https://www.consul.io/downl

appium--自动检测端口和释放端口

检测端口 当端口被其他服务占用时,如果我们还启动这个端口,则会报错,所以很有必要在使用这个端口时,先来检测一下这个端口有没有被其他服务使用. 端口检测需要用到socket模块来校验端口是否被占用 什么是socket? 网络上的两个程序通信,底层都是使用socket来实现的.socket的本质是编程接口,对TCP/IP的封装. shutdown(flag) 禁止在 一个socket上进行数据的接收与发送,利用shutdown函数使socket双向数据传输变为单项数据传输, shutdown()需要