【现学现忘&Shell流程控制】— 43.if语句(3)

(2)示例2

在实际工作当中,服务器上的服务经常会宕机,拿apache服务来举例,如果我们对服务器监控不好,就会造成服务器中服务中断了,而管理员却不知道的情况。发现后等到管理员的介入,也会有一定时间的延迟。这时我们就可以写一个脚本来监听本机的服务,如果服务停止或宕机了,可以自动重启这些服务。

我们就以apache服务来举例:

前提,我们通过RPM包的方式安装了apache服务,并启动,如下图:


【现学现忘&Shell流程控制】— 43.if语句(3)_第1张图片
方式一:

分析该脚本该如何实现:

思路:把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中的正则表达式是包含匹配,像8088080等这样的内容,都会被匹配出来。

使用该脚本:

  • 执行chmod 755 if3.sh命令,将if3.sh变成可执行文件。
  • 执行netstat -tuln,查看此时apache服务是否启动。
    【现学现忘&Shell流程控制】— 43.if语句(3)_第2张图片
  • 执行./if3.sh命令,执行脚本文件,检查到apache服务是启动状态

  • 此时关掉apache服务。



    再查看一下80端口是否已关闭。


    【现学现忘&Shell流程控制】— 43.if语句(3)_第3张图片
  • 然后在执行if3.sh脚本文件

    可以看到执行if3.sh脚本文件,发现apache服务没有启动,
    该脚本会自动启动apache服务。
  • 最后我们再查看一下apache服务是否启动。


    【现学现忘&Shell流程控制】— 43.if语句(3)_第4张图片

    又重新启动了。

提示:
脚本执行过程中,发现服务未启动,会通知管理员,同时也可以通过命令直接把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

(当然实际工作中处理该类问题有监控服务器来进行监控,以上只是一个练习。)

你可能感兴趣的:(【现学现忘&Shell流程控制】— 43.if语句(3))