您的位置:首页 > 运维架构 > Shell

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

2017-12-13 11:38 826 查看

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

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

#!/bin/bash

. /etc/profile
WORK_DIR=`pwd` #获取当前目录

cd $WORK_DIR
[ ! -d log ] && mkdir log #log目录不存在则创建
exec 1>$WORK_DIR/log/m.log #定位脚本的输出
exec 2>$WORK_DIR/log/m.err

LOCK="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 #锁不存在,则要执行拉起,并创建锁文件
#获取本机的IP
LOCAL_IP=`/sbin/ifconfig eth1 | /bin/awk '/inet / {printf ("%s;",$2)} END {print}' | /usr/bin/tr -d "addr:" | /bin/awk -F \; '{print $1}'`

ERR=0
while read -r line
do
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.confrela_baike_tornado_server_1.py|zhoumi|1|cd /search/sdc/baike_inlink_server/server_rela_baike; ./start_1.sh
rela_baike_tornado_server_2.py|zhoumi|1|cd /search/sdc/baike_inlink_server/server_rela_baike; ./start_2.sh

ark_tornado_server_1.py|denglinjie|1|cd /search/sdc/baike_inlink_server/server_ark_baike; ./start_ark_server_1.sh
ark_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/bash

successThreshold=1000000
slog='./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 >> $slog
fi

echo $yestaday', success count: '$successCount >> $slog

脚本的crontab配置:
0 3 * * * cd /search/sdc/monitor/auto_start; sh statisticProcess.sh 2 > statisticProcess.err

每天的凌晨3点执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: