这是专门为一个有针对性的业务写的脚本,先简单介绍下业务形态,免得以后连我自己都看不明白:在资料库, 每个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" " "` [ -z "$MOUNTED" ] && echo "ERROR! 磁盘挂载异常:没有挂载任何待检测的磁盘" >> $CHKLOG && exit 0 } # 检查资料库文件 echo "${LGTIME} 开始检查…" >> $CHKLOG [ ! -e ${SOURCE} ] && echo "ERROR! 资料库异常:在指定位置找不到文件" >> $CHKLOG && exit 0 # 获取匹配的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" " "` [ -n "${MTDISKi}" ] && let IPSTAT++ && MTDISK+=" "${MTDISKi} done [ ${IPSTAT} -eq 0 ] && echo "未在资料库找到匹配的数据" >> $CHKLOG && exit 0 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 [ ${MTCONT} -lt ${#MTDISK[@]} ] && echo "ERROR! 磁盘挂载异常:部分磁盘挂载失败" >> $CHKLOG DISKID=(`echo ${DISKID[@]} | tr ' ' '\n' | sort|uniq | tr '\n' ' '`) } # 判断目录是否只读 CHECK_DIRECTORY () { MTDIRS=(${MTDIRS}) for vardir in ${MTDIRS[@]} do TCHDIR=${vardir}/file touch ${TCHDIR} [ -e ${TCHDIR} ] && rm ${TCHDIR} && echo "磁盘${vardir}读写正常" >> $CHKLOG || echo "ERROR! 磁盘${vardir}读写异常" >> $CHKLOG done } # 判断进程状态 CHECK_PROCESS () { [ ${#DISKID[@]} -eq 0 ] && echo "没有待检测的进程" >> $CHKLOG && exit 0 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` [ ${PDSTAT} -lt 5 ] && echo "ERROR! 进程${PDNAME}${varpid}出现异常,且至少持续${SLTIME}秒" >> $CHKLOG 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/磁盘/进程】