Linux中自动检测并恢复应用(shell版)

本Shell脚本功能:在Linux系统中,通过检测服务端口(serviceport)、进程名称(processkeys)或系统服务名(servicename)的方式来判断应用运行状态,并且尝试(1次)自动恢复已经停止运行的应用。

编写脚本

编辑脚本/opt/scripts/check_restart_app.sh

#!/bin/bash

#-- 定义日志文件 --#
chktime=`date "+%Y-%m-%d %H:%M:%S"`
logdate=`date "+%Y%m%d"`
logpath="/opt/scripts/log-$logdate-"

#-- 定义应用变量 --#

# 待检测的应用数组,必填,与检测方式、进程关键字等数组中的顺序须一一对应
appname=(httpd api mysqld)
# 检测方式:1-进程关键字,2-服务端口,3、系统服务名称
checkmethod=(2 1 3) 
# 进程关键字
processkeys=("" "service-api.jar" "")
# 服务端口
serviceport=("80" "" "3306")
# 系统服务名
servicename=("httpd" "" "")
# 临时文件,应用重启前需要清理的文件
tmpfile=("" "/opt/service-api/status" "")
# 启动目录,部分应用的启动脚本需要进入指定目录后才能执行
exepath=("" "/opt/service-api/" "")
# 应用启动命令
exemath=("/etc/init.d/httpd start" "java -jar service-api.jar" "systemctl start mysqld")

#-- 状态检测函数 --#

# 按进程关键字检测
CHECK_PROCESSKEYS () {
  statchkmath="`ps -ef | egrep -w ${processkeys[$i]} | grep -v grep`"
}
# 按服务端口检测
CHECK_SERVICEPORT () {
  statchkmath="`netstat -tnlp | awk {'print $4'} | awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}' | egrep -w ${serviceport[$i]}`"
}
# 按系统服务名检测
CHECK_SERVICENAME () {
  osversion=`cat /etc/redhat-release | sed 's/[^0-9]//g'`
  osversion=${osversion:0:1}
  [ "${osversion}" -ge 7 ] && statchkmath="`systemctl status ${servicename[$i]} | grep running`" || statchkmath="`service ${servicename[$i]} status | grep "is running"`"
}

#-- 应用启动函数 --#

STARTAPP () {
  #检查启动路径和命令是否正常
  if [ -z "${exepath[$i]}" ] && [ -z "${exemath[$i]}" ]
  then
    echo -e "${chktime}\tALARM! ${appname[$i]}运行异常但找不到启动方法 " >> $logpath${appname[$i]}
    break
  fi
  #检查启动目录
  [ -d "${exepath[$i]}" ] && cd ${exepath[$i]}
  #检查临时文件
  [ -e "${tmpfile[$i]}" ] && rm -f ${tmpfile[$i]}
  #执行启动命令
  ${exemath[$i]}
  echo -e "${chktime}\tINFO! ${appname[$i]}已尝试启动,启动结果等待下一次检测" >> $logpath${appname[$i]};
}

#-- 开始检测应用 --#

[ ${#appname[@]} -eq 0 ] && exit 1
for ((i=0;i<${#appname[@]};i++))
do
{
  if [ ${checkmethod} = "" ]
  then
    echo -e "${chktime}\tATTENTION! ${appname[$i]}没有定义检测方法" >> $logpath${appname[$i]}
    break
    #或设置默认检测方法
    #checkmethod=1
  fi
  case ${checkmethod} in
    1)
    CHECK_PROCESSKEYS;;
    2)
    CHECK_SERVICEPORT;;
    3)
    CHECK_SERVICENAME;;
    *)
    echo -e "${chktime}\tATTENTION! ${appname[$i]}不存在的检测方法" >> $logpath${appname[$i]}
    continue;;
  esac
  [ ${statchkmath} = "" ] && echo -e "${chktime}\tERROR! ${appname[$i]}运行异常,尝试重新启动" >> $logpath${appname[$i]} && STARTAPP
}
done

添加定时任务

crontab -e
*/5 * * * * /opt/scripts/check_restart_app.sh

原创文章禁止转载:技术学堂 » Linux中自动检测并恢复应用(shell版)

精彩评论

9+7=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏