【现学现忘&Shell流程控制】— 43.if语句(3)
(2)示例2
在实际工作当中,服务器上的服务经常会宕机,拿apache服务来举例,如果我们对服务器监控不好,就会造成服务器中服务中断了,而管理员却不知道的情况。发现后等到管理员的介入,也会有一定时间的延迟。这时我们就可以写一个脚本来监听本机的服务,如果服务停止或宕机了,可以自动重启这些服务。
我们就以apache服务来举例:
前提,我们通过RPM包的方式安装了apache服务,并启动,如下图:
![](https://img.haomeiwen.com/i2495229/7633148453b41830.png)
方式一:
分析该脚本该如何实现:
思路:把80端口截取出来,赋值到一个变量中,
判断该变量的值是否为80,是则记录日志,不是则执行启动apache服务。
开始编写:
创建文件if3.sh
:
#!/bin/bash
# 判断apache服务是否启动,如果没有启动则自动启动。
# 1.把80端口截取出来,赋值到一个变量中
port=$(netstat -tuln | awk '{print $4}' | grep ":80$")
# 2.判断port变量是否为空
if[ "$port" == "" ]
then
# 为空则证明apache服务没有启动
# 发送邮件
echo "apache httpd is down,must restart!"
# 启动apache服务
/etc/rc.d/init.d/httpd start &>/deb/null
# 这里不建议使用service的方式启动apache服务,
# service启动服务是一种快捷方式,
# 有可能在脚本中会出问题,这里需要注意一下。
else
# 不为空则证明apache服务以启动
# 可以记录日志
echo "apache httpd is ok."
fi
注意:
不能通过
grep "80"
命令来过滤数据,因为Shell中的正则表达式是包含匹配,像808
、8080
等这样的内容,都会被匹配出来。
使用该脚本:
- 执行
chmod 755 if3.sh
命令,将if3.sh
变成可执行文件。 - 执行
netstat -tuln
,查看此时apache服务是否启动。
-
执行
./if3.sh
命令,执行脚本文件,检查到apache服务是启动状态
-
此时关掉apache服务。
再查看一下80端口是否已关闭。
- 然后在执行
if3.sh
脚本文件
可以看到执行if3.sh
脚本文件,发现apache服务没有启动,
该脚本会自动启动apache服务。
-
最后我们再查看一下apache服务是否启动。
又重新启动了。
提示:
脚本执行过程中,发现服务未启动,会通知管理员,同时也可以通过命令直接把apache服务进行重新启动。而不需要管理员来了,才重启服务。只要管理员接收到通知服务器有问题,过来检查什么原因就可以了。
方式二:
上面实现的方式,基本能够实现检测apache服务的需求。
但是实际工作环境中,可能有种情况,比如apache服务正常,80端口也被开启,但是此时的访问人数过多,把apache服务直接挤爆了。也就是说进程在,端口也在(卡死),但是apache服务已经不应答了。这个时候我们还通过检查80端口的方式,我们是无法发现服务器中apache服务的问题的。
我们先学习一个命令:
nmap
命令是端口扫描命令,命令格式如下:
[root@localhost ~]# nmap -sT 域名或 IP
选项:
-s:扫描。
-T:扫描所有开启的TCP端口。
nmap
命令的原理是客户端(nmap
)给一个服务器所有的端口发送信息,看都有那些端口回复信息,回复了证明该服务器上的端口上的程序正常。
唯一的问题是nmap
命令扫描的时间比较长。
如果你的Linux系统中没有安装nmap
命令,可以执行命令yum -y install nmap
进行安装。
nmap
命令来扫描本机的端口,执行结果如下:
[root@localhost tmp]# nmap -sT 192.168.37.128
Starting Nmap 5.51 ( http://nmap.org ) at 2020-10-19 00:18 CST
Nmap scan report for 192.168.37.128 (192.168.37.128)
Host is up (0.0019s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http (apache的状态是open)
111/tcp open rpcbind
Nmap done: 1 IP address (1 host up) scanned in 0.16 seconds
知道了nmap
命令的用法,我们在脚本中使用的命令就是为了截取http的状态,只要状态是“open”
就证明apache启动正常,否则证明apache服务启动错误。
开始编写脚本:
#!/bin/bash
# 判断apache服务是否启动,如果没有启动则自动启动
# 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量stat。
# 只有apache服务的进程名叫`http`
# 截取第二列是获取nmap扫描后的端口状态
stat=$(map -sT 192.168.37.128 | grep tcp | grep ssh | awk '{print $2}')
# 如果变量stat的值是“open”
if[ "$port"=="open" ]
then
# 则证明apache服务正常启动,在正常日志中写入一句话即可
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
# 否则证明apache服务没有启动,自动启动apache服务
/etc/rc.d/init.d/httpd start &>/dev/null
# 并在错误日志中记录自动启动apche服务的时间
echo "$(date) restart httpd!!" >> /tmp/autostart-err.1og
fi
(当然实际工作中处理该类问题有监控服务器来进行监控,以上只是一个练习。)