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使用技巧。