本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版)