1. 题目
写一个脚本, 判断本机的 80 端口 (假设服务为 httpd) 是否开启着, 如果开启着就什么都不做, 如果发现端口不存在, 那么重启一下 httpd 服务, 并发邮件通知你自己. 脚本写好后, 每分钟执行一次, 也可以写一个死循环的脚本, 30S 检查一次.
2. 习题分析
首先, 我们要区分要求, 这里的要求是检测 80 端口是否在监听, 而不是检测 httpd 服务是否运行, 虽然两者有一定的联系, 但并不是对等的关系. 检测端口状态用 netstat -lntp 命令. 如果要求检测远程主机的端口状态, 则用一下的命令:
nmap -p 80 host_remote_ip ## 替换成远程主机的 ip 就可以了
例如:
- [root@cenvm72 ~]# 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) http://blog.51cto.com/hellocjq/2097553 里面的 mail.py 脚本可以继续使用. 使用方法, 可以去翻翻文章.
3. 检测脚本
- [root@cenvm71 work]# cat check_80.sh
- #!/bin/bash
- ma="921423681@qq.com"
- 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
脚本分析:
if 条件的判断可以是一条命令, 当命令执行成功条件成立. 例如:
- [root@cenvm71 work]# ls /etc/passwd
- /etc/passwd
- [root@cenvm71 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 命令只判断返回的状态码.
第二点要注意的是, netstat -lnpt | grep -q ':80', 是用来判断系统的 80 端口是否在监听, 而且在':80'最后还有一个空格, 这个也是为了匹配准确. 因为有可能会匹配到 8080 端口.
grep -q 仅仅进行匹配, 不会将结果打印出来, 用在 if 判断, 效果正好, 不用加 ">/dev/null 2>/dev/null";
按照要求, 如果 80 端口没有启动, 我们就要启动 httpd 服务. 启动服务之后, 我们还应该检测一下 httpd 服务是否已经真的启动成功了. 方法很简单, 就是检测一下 httpd 进程是否存在.
pgrep -l httpd 命令, 除了会列出 httpd 的 pid 外, 还会将进程名称一起列出来
如果 httpd 没有正常启动, 那么就将错误信息输出到一个文件. 然后, 在发送警告邮件的时候, 将错误信息作为邮件内容, 发送.
4. 结语
这道习题并不困难, 但是有一些可以琢磨的地方, 让大家不断精进. 例如 if 条件的灵活运用, pgrep 的运用, 还有邮件脚本的结合运用等等.
每日一道 shell 练习(06)-- 检测端口服务
来源: http://www.bubuko.com/infodetail-2587981.html