服务自动拉起,定时日志清理,数据统计的shell脚本

来源:互联网 发布:编写c语言用什么软件 编辑:程序博客网 时间:2024/05/19 18:48

1. 首先是自动拉起的脚本:monitorProcess.sh

我们需要自动拉起的服务是通过配置文件来进行配置的,我们制定了自己的配置文件格式,定时任务定时读取配置文件中配置的需要拉起的服务来执行拉起

#!/bin/bash. /etc/profileWORK_DIR=`pwd`   #获取当前目录cd $WORK_DIR[ ! -d log ] && mkdir log    #log目录不存在则创建exec 1>$WORK_DIR/log/m.log   #定位脚本的输出exec 2>$WORK_DIR/log/m.errLOCK="MLOCK"OLD_LOCK=`find -cmin +60 -name $LOCK`  #查找60分钟之前被访问过的锁文件MLOCK[ -n "$OLD_LOCK" ] && rm $OLD_LOCK     #如果锁文件在60分钟之前被修改过(即近60分钟没有被改过),则删除锁文件[ -f $LOCK ] && { echo "lock exits" ; exit 1;}  #如果锁文件仍然存在,则说明锁文件在近60分钟内被修改过,说明进程正在被拉起,则退出touch $WORK_DIR/$LOCK  #锁不存在,则要执行拉起,并创建锁文件#获取本机的IPLOCAL_IP=`/sbin/ifconfig eth1 | /bin/awk '/inet / {printf ("%s;",$2)} END {print}' | /usr/bin/tr -d "addr:" | /bin/awk -F \; '{print $1}'`ERR=0while read -r linedo    echo $line | grep ^# 1>&2>/dev/null  #过滤掉注释行    [ $? -eq 0 ] && continue   #如果是注释行则继续    proc=`echo $line | awk -F"|" '{print $1}' `   #从一行数据中提取以|分割的每个字段    person=`echo $line | awk -F"|" '{print $2}' `    if_restart=`echo $line | awk -F"|" '{print $3}' `    restart_cmd=`echo $line | awk -F"|" '{print $4}' `    if [ -z "`ps -ef |grep -w "$proc" | grep -v grep`" ] ; then   #判断进程是否存活        ./sgSendMsg "$person" "$person" "${LOCAL_IP}_${proc}_down"  #如果不存活,则发报警短信(公司的发短信脚本,可根据业务需求自行设计)        if [ $if_restart -eq 1 ] ; then   #如果为1,则表示在服务挂掉的时候要拉起            eval $restart_cmd   #执行拉起命令            echo "`date +'%Y-%m-%d %T'` ${proc} restarted" >>$WORK_DIR/log/restart.log   #打印日志        fi      else        echo "`date +'%Y-%m-%d %T'` ${proc} ok"   #打印日志    fi  done<$WORK_DIR/process.conf   #逐行读取配置文件来拉起服务rm -f $WORK_DIR/$LOCK   #拉起完毕后删除锁

配置文件为:process.conf

rela_baike_tornado_server_1.py|zhoumi|1|cd /search/sdc/baike_inlink_server/server_rela_baike; ./start_1.shrela_baike_tornado_server_2.py|zhoumi|1|cd /search/sdc/baike_inlink_server/server_rela_baike; ./start_2.shark_tornado_server_1.py|denglinjie|1|cd /search/sdc/baike_inlink_server/server_ark_baike; ./start_ark_server_1.shark_tornado_server_2.py|denglinjie|1|cd /search/sdc/baike_inlink_server/server_ark_baike; ./start_ark_server_2.sh

每行是以'|' 来进行分割的,每个字段有不同的含义,这些字段在上面的脚本中依次读取,代表不同的含义:

含义如下:

服务名称 | 报警联系人 | 是否拉起 | 拉起需要执行的脚本
服务名称     :就是我们的脚本用ps命令来查看这个服务是否还存在,从而判断服务是否存活报警联系人 :服务如果挂掉了,还要通知联系人是否拉起     :服务挂掉了,我可以拉起,也可以不拉起。1-拉起,其他不拉起拉起需要执行的脚本:服务挂掉了,如何拉起呢?按照这个命令来还行就可以自动拉起了

下面是crontab中关于该脚本的配置:

*/5 * * * * cd /search/sdc/monitor/auto_start; sh monitorProcess.sh 2> monitorProcess.err

每5分钟执行一次,错误日志重定向到monitorProcess.err文件中


2. 定时日志清理功能的crontab配置

5 * * * * find /search/sdc/baike_inlink_server/log/*.log -mtime +3 -delete

这里配置的是:每个小时的第5分钟来查找并清理3天以前的日志


3. 数据统计功能

项目中,经常需要对日志数据做统计,我的脚本为:statisticProcess.sh

#!/bin/bashsuccessThreshold=1000000slog='./log/statistic_para_match.log'    #日志文件的路径yestaday=`date -d '1 days ago' +%Y%m%d`  #获取昨天的日期#统计日志目录下昨天的日志文件中成功的条数(我的每行日志是以\t分割,倒数第二个字段为Succ表示成功) successCount=`cat /search/sdc/baike_inlink_server/log/para_match_tornado.*.${yestaday}_*.log | awk -F '\t' '{if(NF > 1 && $(NF-1) == "Succ") c += 1} END{print c}'`if [ $successCount -lt $successThreshold ]  #如果成功的次数小于预期值,则发送报警短信then    ./sgSendMsg denglinjie denglinjie 'success count only '$successCount >> $slogfiecho $yestaday', success count: '$successCount >> $slog

脚本的crontab配置:

0 3 * * * cd /search/sdc/monitor/auto_start; sh statisticProcess.sh 2 > statisticProcess.err

每天的凌晨3点执行





阅读全文
0 0
原创粉丝点击