美文网首页shell
【现学现忘&Shell流程控制】— 43.if语句(3)

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

作者: 繁华似锦Fighting | 来源:发表于2020-10-31 10:13 被阅读0次

    (2)示例2

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

    我们就以apache服务来举例:

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


    方式一:

    分析该脚本该如何实现:

    思路:把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服务是否启动。
    • 执行./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
    

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/wacsvktx.html