【第001篇】Linux下的进程守护脚本代码示例(守护Tomcat服务)

#!/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
上一篇:shell 实现项目的启动与停止


下一篇:乌班图20.04上安装java配置tomcat9