程序守护进程shell脚本编写
程序守护进程shell脚本编写
#! /bin/bash ################################################# # 文件名:hcicloud_monitor.sh # desc: a tool for checking service running status for every $interval seconds. Restart service when detect program shut down. # 注意 需要正确设置启动环境检测内容 脚本检测到进程异常时 会先检查依赖环境是否就绪 依赖环境就绪时才会拉起监控的进程 VERSION="1.0.6" #版本号 MODIFIED_TIME="2018/03/08" #修改时间 DEPLOY_UNION="cloud" #部署单元 EDITER_MAIL="wangyu1@sinovoice.com.cn" #编写人邮箱 ################################################# #============================================================================================ #确认脚本执行时是否带有监控程序名称 和 服务编码参数 #============================================================================================ if [ "$#" -lt 1 ] then echo "Usage: $0 program_name" exit -1; fi # 休息间隔时间设置 单位为秒 INTERVAL=5 # PROGRAM 为要守护的可执行程序 # 第一个参数是被守护的进程 PROGRAM="$1" #============================================================================================ #发现服务宕机后,要做的动作:记录时间,打包文件,重启服务。 #============================================================================================ ARG_01=$1 action1() { pushd $(pwd) #重启出现问题的服务 ./$PROGRAM -d popd } #=========================================================================================== echo "monitor_check is checking......" #------------------------------------------------------------------------------------------- #============================================================================================ # main program #============================================================================================ # 当前休息间隔时间 cur_interval=$INTERVAL # 拉起服务尝试次数计数 try_times=1 while true do #查看目标进程是否在运行 PRO_NOW=`ps -ef ${my_user_name} | grep -w "$PROGRAM " | grep -v grep | grep -v gdb | wc -l` if [ $PRO_NOW -eq 0 ] then # 若拉起服务失败 每次增加等待时间 重试时间间隔成指数增长(1.5、3、6、12、24、48、64、...秒) if [ $try_times -gt 1 ];then cur_interval=$[cur_interval*2] fi echo "`date +"%Y-%m-%d %H:%M:%S"`, $PROGRAM is not running now, try_times = $try_times, cur_interval = $cur_interval" >> $HOME/cloud/bin/nohup.out let try_times++; action1 else # 拉起服务成功 重置尝试次数 try_times=1 cur_interval=$INTERVAL fi #每隔一段时间执行查看一次进程是否存在 sleep $cur_interval done exit 0
启动守护进程方法
/qhapp/ta/cloud/text_analyze/bin/hcicloud_monitor.sh
/qhapp/ta/cloud/text_analyze/bin/servicfx_text_analyze -d
./hcicloud_monitor.sh 应用程序名称 servicfx_text_analyze
这个守护进程会每隔5秒去检查一次应用程序进程。
如果发现程序进程不存在,就会自动拉起应用servicfx_text_analyze。
如果第一次,自动拉起应用servicfx_text_analyze失败,就会在5秒的基础上增加1.5秒后重新拉起应用程序。没失败一次就在5秒的基础上时间间隔成指数增长(1.5、3、6、12、24、48、64、...秒)。
#! /bin/bash
#################################################
# 文件名:hcicloud_monitor.sh
# desc: a tool for checking service running status for every $interval seconds. Restart service when detect program shut down.
# 注意 需要正确设置启动环境检测内容 脚本检测到进程异常时 会先检查依赖环境是否就绪 依赖环境就绪时才会拉起监控的进程
VERSION="1.0.6" #版本号
MODIFIED_TIME="2018/03/08" #修改时间
DEPLOY_UNION="cloud" #部署单元
EDITER_MAIL="wangyu1@sinovoice.com.cn" #编写人邮箱
#################################################
#============================================================================================
#确认脚本执行时是否带有监控程序名称 和 服务编码参数
#============================================================================================
if [ "$#" -lt 1 ]
then
echo "Usage: $0 program_name"
exit -1;
fi
# 休息间隔时间设置 单位为秒
INTERVAL=5
# PROGRAM 为要守护的可执行程序
# 第一个参数是被守护的进程
PROGRAM="$1"
#============================================================================================
#发现服务宕机后,要做的动作:记录时间,打包文件,重启服务。
#============================================================================================
ARG_01=$1
action1()
{
pushd $(pwd)
#重启出现问题的服务
./$PROGRAM -d
popd
}
#===========================================================================================
echo "monitor_check is checking......"
#-------------------------------------------------------------------------------------------
#============================================================================================
# main program
#============================================================================================
# 当前休息间隔时间
cur_interval=$INTERVAL
# 拉起服务尝试次数计数
try_times=1
while true
do
#查看目标进程是否在运行
PRO_NOW=`ps -ef ${my_user_name} | grep -w "$PROGRAM " | grep -v grep | grep -v gdb | wc -l`
if [ $PRO_NOW -eq 0 ]
then
# 若拉起服务失败 每次增加等待时间 重试时间间隔成指数增长(1.5、3、6、12、24、48、64、...秒)
if [ $try_times -gt 1 ];then
cur_interval=$[cur_interval*2]
fi
echo "`date +"%Y-%m-%d %H:%M:%S"`, $PROGRAM is not running now, try_times = $try_times, cur_interval = $cur_interval" >> $HOME/cloud/bin/nohup.out
let try_times++;
action1
else
# 拉起服务成功 重置尝试次数
try_times=1
cur_interval=$INTERVAL
fi
#每隔一段时间执行查看一次进程是否存在
sleep $cur_interval
done
exit 0