Shell编程—检查模块

Shell中的一些检查办法

简述:

shell在日常的部署中很多情况需要去部署一些第三方的软件或者服务,而在一个相对成熟的项目中所使用到的服务与软件不止一个,为了更好的去管理这些第三方的服务与软件,开发与运维往往会引入一套成熟的进程管理装置,例如,Systemd、Supervisord、systemd、docker service等等,对于一些网络项目更是会开放很多的端口,而检查端口开放状态也有很多办法,例如 telnet [IP] [Port] 去尝试连接或者直接使用netstat、lsof -i [PORT]等等多种办法来达成我们的目的。这篇文章主要是介绍通过Shell更方便快捷的实现对多个服务或者端口的监控检查,会从服务信息获取与信息判定两方面进行分享。 其中代码例子只是一部分,希望借此抛砖引玉。

监控流程:

在这里插入图片描述

监控信息的获取:
(1)监控Supervisor的运行情况

启动一个简单的supervisor的服务作为要监控的目标
在这里插入图片描述

#!/bin/bash
SupervisorList=(good_process bad_process)

function CheckSupervisor() {
    for supervisor in ${SupervisorList[@]};do
        supervisor_status=`supervisorctl status $supervisor|awk '{print $2}'`
        if [[ ${supervisor_status} = "RUNNING" ]];then
            log "supervisor ${supervisor} is [OK]"
        else 
            log -w "supervisor porcess $supervisor is not RUNNING"
            #日志模块代码见https://editor.csdn.net/md/?articleId=109956963
        fi
    done
}

CheckSupervisor

在这里插入图片描述

(2) 监控Systemd进程

这里以nginx(正常启动)与httpd(异常终止)为例来完成一个基于systemd服务的监控脚本
在这里插入图片描述
在这里插入图片描述

#!/bin/bash
SrvList=(nginx httpd)
function CheckSystemd () {
    for srv in ${SrvList[@]};do
        srv_status=`systemctl status $srv`
        if [[ ${srv_status} =~ "active (running)" ]];then
            log "service $srv [OK]"
        elif [[ ${srv_status} =~ "could not be found" ]];then
            log -w "service $srv is not be found"
        else
            log -w "service $srv is not be start"
        fi
    done
}

CheckSystemd

在这里插入图片描述

(3)监控端口开放状态

监听端口我们先看一下目前开放的端口,其中80 、22 、42908这几个端口是开放的
在这里插入图片描述

在这里插入图片描述

根据信息内容进行判别:

这里介绍几个关于校验shell输出结果的几个比较简单的方法

(1)包含=~字符串判定
#!/bin/bash

function main() {
    a=" this is a num test:1234567890"
    if [[ ${a} =~ "num" ]];then
        echo "a have num"
    fi
    if [[ ${a} =~ "string" ]];then
        echo "a have string"
    fi
}

main

在这里插入图片描述

(2)wc -l返回行数判定

使用格式[Command] |wc -l

#!/bin/bash

function good() {
    echo this is line one
    echo this is line two
}

function bad() {
    echo this is only one line
}
function main() {
    funcList=(good bad)
    for func in ${funcList[@]};do
        line=`${func} |wc -l`
        if [[ ${line} -eq 2 ]];then
            echo Good have two line
        elif [[ ${line} -eq 1 ]];then
            echo Bad have only one line
        fi
    done
}

main

在这里插入图片描述

(3)$?执行结果判定

$? 返回0代表上一条命令执行成功 否则打代表失败 此时$?的值就是返回的状态码

#!/bin/bash

function main() {
    ping -c 1 baidu.com
    echo $?
    pin -c 1 baidu.com
    echo $?
}

main

在这里插入图片描述

小结:

shell中的字符处理与判定相对很多市面上的高级语言是非常灵活的,而且随着linux软件体系的扩充能使用的命令与技巧也越来越多,文中的一些方法相对linux shell这个庞大的语言体系来说实在微不足道,最后欢迎大家的批评指点,同时也非常期盼各路大神能分享些关于shell使用技巧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值