通过脚本探测业务运行状态【IP/磁盘/进程】

这是专门为一个有针对性的业务写的脚本,先简单介绍下业务形态,免得以后连我自己都看不明白:在资料库, 每个IP对应一群挂载的磁盘,当每块磁盘成功挂载后必须启动对应的应用进程。

脚本功能是:比对本机IP(多个)是否在资料库中存在,如果存在则获取对应的磁盘目录(均带编号)是否已经正常挂载,如果挂载成功则检查对应的进程是否正常(进程名称包含编号且与磁盘编号相同)。

本脚本包含的知识点不多,主要是字符串转数组、字符串拼接、for循环、let命令、tr命令。

#!/bin/bash

LGTIME=`date "+%Y-%m-%d %H:%M:%S"`
CHKLOG="/opt/zabbix/scripts/result.log"
SOURCE="/opt/zabbix/scripts/source.txt"
MTFLAG="^/yun|^/mysql|^/data|^/elk|^/log"
IPHEAD="10.10.200|172.16.18"
SLTIME=5

# 检测磁盘挂载
CHECK_MT () {
MOUNTED=`mount | awk -F' ' '{print $3}' | grep -E "$MTFLAG" | tr "\n" " "`
if [ -z "$MOUNTED" ]; then
  echo "ERROR! 磁盘挂载异常:没有挂载任何待检测的磁盘" >> $CHKLOG
  exit 0
fi
}

# 检查资料库文件
echo "${LGTIME} 开始检查…" >> $CHKLOG
if [ ! -e ${SOURCE} ]; then
  echo "ERROR! 资料库异常:在指定位置找不到文件" >> $CHKLOG
  exit 0
fi

# 获取匹配的IP及应该挂载的磁盘信息
CHECK_IP () {
HOSTIP=(`/sbin/ip addr | grep -E "${IPHEAD}" | awk '{print $2}' | awk -F/ '{print $1}' | tr "\n" " "`)
IPSTAT=0
for varip in ${HOSTIP[@]}
do
  MTDISKi=`grep -E -w "${varip}" ${SOURCE} | awk -F: '{print $2}' | tr "\n" " "`
  if [ -n "${MTDISKi}" ]; then
    let IPSTAT++
    MTDISK+=" "${MTDISKi}
  fi
done
if [ ${IPSTAT} -eq 0 ]; then
  echo "未在资料库找到匹配的数据" >> $CHKLOG
  exit 0
fi
MTDISK=(${MTDISK})
}

# 判断磁盘挂载状态及编号
CHECK_DISK () {
MTCONT=0
for vardisk in ${MTDISK[@]}
do
  MTSTAT=$(echo -E "$MOUNTED" | grep -E -w "$vardisk")
  if [ "$MTSTAT" = "" ]; then
    echo "ERROR! 磁盘${vardisk}异常:没有挂载磁盘" >> $CHKLOG
  else
    let MTCONT++
    MTDIRS+=" "${vardisk}
    DISKIDi=`echo "$vardisk" | awk -F/ '{print $2}' | tr -d "\/a-zA-Z"`
    DISKID+=" "$DISKIDi
    echo "磁盘${vardisk}挂载正常" >> $CHKLOG
 fi
done
if [ ${MTCONT} -lt ${#MTDISK[@]} ]; then
  echo "ERROR! 磁盘挂载异常:部分磁盘挂载失败" >> $CHKLOG
fi
DISKID=(`echo ${DISKID[@]} | tr ' ' '\n' | sort|uniq | tr '\n' ' '`)
}

# 判断目录是否只读
CHECK_DIRECTORY () {
MTDIRS=(${MTDIRS})
for vardir in ${MTDIRS[@]}
do
  TCHDIR=${vardir}/file
  touch ${TCHDIR}
  if [ -e ${TCHDIR} ]; then
    rm ${TCHDIR}
    echo "磁盘${vardir}读写正常" >> $CHKLOG
  else
    echo "ERROR! 磁盘${vardir}读写异常" >> $CHKLOG
  fi
done
}

# 判断进程状态
CHECK_PROCESS () {
if [ ${#DISKID[@]} -eq 0 ]; then
  echo "没有待检测的进程" >> $CHKLOG
  exit 0
fi
PDNAME="tomcat_"
for varpid in ${DISKID[@]}
do
  PDSTAT=`ps -ef | grep -E -w ${PDNAME}${varpid} | awk -F' ' '{print $NF}' | wc -l`
  if [ ${PDSTAT} -lt 5 ]; then
    echo "进程${PDNAME}${varpid}出现异常,将于${SLTIME}秒后重新检测" >> $CHKLOG
    sleep ${SLTIME}
    PDSTAT=`ps -ef | grep -E -w ${PDNAME}${varpid} | awk -F' ' '{print $NF}' | wc -l`
    if [ ${PDSTAT} -lt 5 ]; then
      echo "ERROR! 进程${PDNAME}${varpid}出现异常,且至少持续${SLTIME}秒" >> $CHKLOG
    fi
  else
    echo "进程${PDNAME}${varpid}运行正常" >> ${CHKLOG}
  fi
done
}

CHECK_IP
CHECK_DISK
CHECK_DIRECTORY
CHECK_PROCESS

资料库source.txt的格式如下:

#资料库主机IP	:挂载的磁盘
10.10.200.101	:/elk1 /data1 /mysql1
10.10.200.102	:/elk2 /data2 /mysql2 /yun1 /yun2
172.16.18.201	:/log11 /log12 /log13 /log14
172.16.18.202	:/log21 /log22

原创文章禁止转载:技术学堂 » 通过脚本探测业务运行状态【IP/磁盘/进程】

赞 (0) 打赏

精彩评论

2+3=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏