shell脚本-进程[tomcat,jboss等]看门狗

1、脚本简介
进程看门狗,在进程异常退出时会自动拉起进程并记录运行的日志。
函数说明:
log_info:打印日志的函数,入参为需要在日志中打印的msg
start_progress:启动tomcat的函数
check_progres_run:每隔30s检测tomcat进程是否存在
log_backup:备份进程监控日志
2、前提条件
主机上已经部署并运行一个进程,例如tomcat,jboss
3.脚本代码

点击查看代码
#!/bin/bash
#以下为多行注释
: << !
作用: watch dog,用于在进程退出后,自动拉起进程
函数说明:
         log_info:打印日志的函数,入参为需要在日志中打印的msg
         start_progress:启动tomcat的函数
         check_progress_run:每隔10s检测tomcat进程是否存在
         log_backup:备份日志
函数需要自定义的参数:
         progress_name:进程名
         progress_path:进程路径
         log_name:日志名
         log_path:日志路径
         expect_size:日志切割的大小【单位M】
         
!

curr_path=`pwd`
#进程名和安装路径
progress_name=jboss
progress_path=/opt/apps/jboss


#定义打印日志的函数
function log_info(){
local curr_time=`date "+%Y-%m-%d %H:%M:%S"`
log_file=${curr_path}/${progress_name}_running.log
#判断日志文件是否存在
if [ -e ${log_file} ]
   then
   #检测文件是否可写
   if [ -w ${log_file} ]
   then
       #若文件无写权限则使用chmod命令赋予权限
       chmod 770 ${log_file}
   fi
else
   #若日志文件不存在则创建
   touch ${log_file}
fi
#写日志
local info=$1
echo "${curr_time}  `whoami` [Info] ${info}">>${log_file}
}

function start_progress(){
        log_info "Begin to start ${progress_name}."
        cd ${progress_path}/bin
        log_info "cd ${progress_path}/bin"
        nohup ./standalone.sh > ${progress_path}/jboss.log 2>&1 &
        log_info "nohup standalone.sh > ${progress_path}/jboss.log 2>&1 &"
        #使用ps命令+java进程判断+awk获取${progress_name}的PID
        progress_pid=`ps -aux|grep ${progress_path}|grep -v grep|awk '{print $2}'`
        if  [ -z "${progress_pid}" ]
            then
            cd ${progress_path}/bin && nohup ./standalone.sh > ${progress_path}/jboss.log 2>&1 &
        fi
        log_info "End to start ${progress_name}."
}

#如果progress_pid为零,则说明进程不存在,需要去重启
function check_progress_run()
{
progress_pid=`ps -aux|grep ${progress_path}|grep -v grep|awk '{print $2}'`
echo "${progress_name}'s pid :${progress_pid}"
if [ -z "${progress_pid}" ]
then
   echo "${progress_name} process is not running."
   #调用函数start_tom
   start_progress
   log_info "${progress_name} process is not running."
   #打印日志
else
   echo "${progress_name} process is running"
   #打印日志
   log_info  "${progress_name} process is running"
fi
}


#备份日志
function log_backup(){
log_path=${progress_path}
cd ${log_path}
log_name=jboss.log
#获取当前日志的大小
log_size=`ls -all|grep -v ${log_name}.|grep  ${log_name}|awk '{print $5}'`
echo "${log_name}的大小:`expr ${log_size} \/ 1024 \/ 1024` M "

#当日志大于一定大小时进行备份并清空旧的日志
#日志切割阈值,单位:M
expect_size=100
expect_size=`expr ${expect_size} \* 1024 \* 1024`
echo ${expect_size}

#检查日志备份目录是否存在,不存在则创建
log_backup_path=log_backup_jboss
if [ -d ${log_backup_path} ]
   then
   #检测目录是否可写
   if [ -w ${log_backup_path} ]
   then
       #若目录无写权限则使用chmod命令赋予权限
       chmod 770 ${log_backup_path}
   fi
else
   #若目录不存在则创建
   mkdir  ${log_backup_path}
fi

if [ ${log_size} -gt ${expect_size} ]
   then
   log_info "Begin to backup log."
   local ct=`date "+%Y-%m-%d-%H-%M-%S"`
   cp ${log_name} ./${log_backup_path}/${log_name}.${ct}
   log_info "cp ${log_name} ./${log_backup_path}/${log_name}.${ct}"
   #使用gzip命令压缩日志
   cd ./${log_backup_path}  && gzip -q  ${log_name}.${ct}
   #清空旧日志
   cd ${log_path} && cat  /dev/null > ${log_name}
   log_info "cat  /dev/null > ${log_name}"
fi
}

#隔30s循环执行check_tom_1run
while [ 1 ]
do
   check_progress_run
   log_backup
   #休眠30s
   sleep 30
done

posted @ 2021-10-21 16:48  Jurioo  阅读(223)  评论(0)    收藏  举报