#!/bin/bash
#进程守护
#su - yqfwzhpt
# ================部署资料整理===================
# cd /app/rsweb/logs/yqdz/
# mkdir shell
# cd /app/rsweb/web/
# mkdir shell_daemons
# 将本文件放在/app/rsweb/web/shell_daemons/目录下
# chmod 777 yqdzcentral.sh
# =========不中断的在后台运行脚本说明============
# 不中断的在后台运行yqdzcentral.sh:命令:"nohup ./yqdzcentral.sh &"(yqdzcentral.sh的打印信息会输出到当前目录下的nohup.out中)
# 使用jobs可看到yqdzcentral.sh处于running状态
# 使用ps -ef |grep yqdzcentral.sh可查看到正在运行的yqdzcentral.sh脚本进程
# 退出当前shell终端,再重新打开,使用jobs看不到正在运行的yqdzcentral.sh,但使用ps -ef可以看到。
# nohup ./yqdzcentral.sh > yqdzcentral.out 2>&1
# 如果执行脚本报错:/bin/sh^M:bad interpreter:No such file or directory
# 分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
# 解决方法如下:
# vi yqdzcentral.sh
# 利用如下命令查看文件格式 :set ff 或 :set fileformat
# 可以看到如下信息:fileformat=dos 或 fileformat=unix
# 利用如下命令修改文件格式 :set ff=unix 或 :set fileformat=unix
# 最后执行强制保存并退出命令:wq!
# ===============开机启动此文件==================
# 谨慎执行...
# vi /etc/rc.d/rc.local
# 将此语句粘贴到文件中:/app/rsweb/web/shell_daemons/yqdzcentral.sh start
# ===============================================
# ================程序逻辑代码===================
# ===============================================
# 脚本名称 #TODO
SHELL_NAME='yqdzcentral.sh'
# 日志存放路径 #TODO
SHELL_LOG='/app/rsweb/logs/yqdz/shell/logs.txt'
# 服务目录、验证请求是否正常地址(前置、后置)
# 前置程序 #TODO
QZ_TOMCAT_HOME='/app/rsweb/apache-tomcat-7.0.73-yqdz-yqdzcentral'
QZ_HREF='http://localhost:8081/yqdzcentral/portal/isRun'
# 后置程序 #TODO
HZ_TOMCAT_HOME='/app/rsweb/apache-tomcat-7.0.73-yqdz-yqdzcentralds'
HZ_HREF='http://localhost:8082/yqdzCentralCore/datasource/portal/isRun'
# 处理逻辑:
# 1.检查服务是否正常运行,如果服务停止了,那么休眠3秒后启动服务;如果服务运行着,那么进行第二步验证。
# 2.验证请求是否正常,如果正常,则不处理;如果不正常,则杀掉进程并重新启动服务。
# 定义函数(利用参数位置设置变量$1、$2)
doWork(){
# 初始化变量:本函数中$1代表TOMCAT_HOME;$2代表HREF
TOMCAT_HOME=$1
HREF=$2
STARTTOMCAT=$TOMCAT_HOME/bin/startup.sh
# 开始处理逻辑...
# 1.检查服务是否正常运行,如果服务停止了,那么休眠3秒后启动服务;如果服务运行着,那么进行第二步验证。
# 查询进程pid
proc_id=`ps -ef | grep -i ${TOMCAT_HOME} | grep -v "grep" | awk '{print $2}'`
echo ${proc_id[@]}
if [[ -z $proc_id ]];then # 表示服务停止了
echo ${TOMCAT_HOME} " is not running ! "
echo ${TOMCAT_HOME} " is not running ! " >> $SHELL_LOG
sleep 3
# 启动服务
$STARTTOMCAT
echo "Start command executed after 3s sleep ! "
echo "Start command executed after 3s sleep ! " >> $SHELL_LOG
else # 表示服务运行着
echo ${TOMCAT_HOME}" pid is "${proc_id[@]}
# 2.验证请求是否正常,如果正常,则不处理;如果不正常,则杀掉进程并重新启动服务。
echo "Request href is " ${HREF}
proc_result=`curl ${HREF}`
echo "proc_result is " ${proc_result[@]} " !"
if [ "OK" = "$proc_result" ];then # 表示服务正常运行
echo ${TOMCAT_HOME} " is normal ! "
else # 表示服务存在异常情况,此时将进程号kill掉并重新启动程序
echo ${TOMCAT_HOME} "is not normal ! "
echo ${TOMCAT_HOME} "is not normal ! " >> $SHELL_LOG
echo "kill the server ..."
for pid in ${proc_id[*]}
do
echo ${pid}
#kill掉服务
kill -9 ${pid}
if [ $? -eq 0 ];then
echo ${TOMCAT_HOME} "is killed ..."
echo ${TOMCAT_HOME} "is killed ..." >> $SHELL_LOG
echo "startup $TOMCAT_HOME"
echo "startup $TOMCAT_HOME" >> $SHELL_LOG
# 启动服务
$STARTTOMCAT
echo "Start command executed !"
echo "Start command executed !" >> $SHELL_LOG
else
echo ${TOMCAT_HOME} " failed ..."
echo ${TOMCAT_HOME} " failed ..." >> $SHELL_LOG
fi
done
fi
fi
}
# 轮询调用函数
while true ;do
echo "--------------------------separator--------------------------"
echo "shell log path is " $SHELL_LOG
echo "current time is " $(date +"%Y-%m-%d %H:%M:%S")
echo "current time is " $(date +"%Y-%m-%d %H:%M:%S") >> $SHELL_LOG
#调用函数(后置服务目录、后置请求路径)
doWork $HZ_TOMCAT_HOME $HZ_HREF
echo "*******************************"
#调用函数(前置服务目录、前置请求路径)
doWork $QZ_TOMCAT_HOME $QZ_HREF
echo ""
sleep 600
done