shell定时任务监控日志文件实现告警

1. 场景

在实际工作中,有这样一个场景:有一个定时任务,会定期去执行指定的工作(定时器在执行任务的同时,会打印相关的日志到日志文件中),但是可能因为一些原因,导致定时任务停止执行,这个时候就需要我们在最短的时间内收到告警通知,并修复任务。

2. 思路如下:

1)shell脚本定时去扫描日志文件,找出定时任务最后一次打印日志的时间,然后计算该时间与当前系统时间的时间差。
2)当时间差超过阈值,调用python脚本,推送告警通知(这里可以采用邮件,短信,以及IM软件等,我下面的示例是调用我们公司内部IM软件的接口)

3. 实现

1)shell脚本

思考:通常日志文件都很大,如果从头到尾的扫描日志文件,并找出最后一次定时任务打印的日志,耗时会很久;因此我们可以从日志文件尾部开始反向扫描,当我们第一次找到定时任务打印的日志行,即为定时任务最后一次打印的日志行。

代码如下:

#!/bin/bash

#日志文件路径
logfile=/home/test/prodduce/apache-tomcat/logs/

#获取日志文件最后一条push记录
# tac 反向查找日志;
# grep -m1 只打印出匹配的行
# awk '{print substr($0, 2, 19)}' 截取时间字段 ,这个取决于你的日志文件打印的格式 
#我的定时任务打印的格式:[2019-03-24 11:47:08]-[INFO] com.app.busi.timer.task.MatchTask MatchTask starting……
lastest_push_date=`tac $logfile/catalina.out | grep -m1 'starting……' | awk '{print substr($0, 2, 19)}'`

#获取当前时间
now_date=`date +"%Y-%m-%d %H:%M:%S"`

#计算时间差,单位秒
date_dist=$(($(date +%s -d "$now_date") - $(date +%s -d "$lastest_push_date")))

#如果时间差超过5分钟,推送告警
if (($date_dist > 300));then
  echo `date +'%Y/%m/%d %H:%M:%S'`" there is a error "
  #/home/test/scrip/notice.py 所要执行的python脚本的位置
  #$date_dist 把这个时间差传递给python脚本
  /usr/bin/python /home/test/scrip/notice.py $date_dist
fi

2)python脚本

# -*- coding: UTF-8 -*-
import urllib
import urllib2
import sys

import time


def sendAlter():
    data = {
        "to": "ertyrtyuertyurtyu",
        # 注意看下面的,sys.argv[1]  此处为接收shell脚本传过来的值
        "message": "timer has stopped {} seconds !!! please restart tomcat !".format(sys.argv[1]),
    }
    url = "接口地址"
    data = urllib.urlencode(data)
    headers = {'User-agent': 'PyMOTW (http://www.doughellmann.com/PyMOTW/)'}
    request = urllib2.Request(url, data, headers)
    response = urllib2.urlopen(request)
    data = response.read()
    print data
    return True
if __name__ == '__main__':
    sendAlter()

3)添加定时任务

执行crontab -e,进入插入模式,输入:

# 每三分钟执行一次shell脚本
*/3 * * * *  /home/test/scrip/scan.sh

4. 命令解释

下面对代码里用到的一些命令的详细解释
1)tactaccat的反转的形式,tac从文件的最后一行往前读取.
2)grep -mNUM, NUM可以是任意数值,官方解释是 Stop reading a file after NUM matching lines ,即当匹配到NUM行时,停止读取,我们的实例是grep -m1,即当匹配到一行时,停止匹配。
3)awkawk '{print substr($0, 2, 19)}' ,$0 表示对该行进行处理,substr($0, 2, 19)整体意思是从该行的第2个字符开始,截取19个字符结束。
4)date,用来获取机器当前时间,如果需要格式化时间,可以加号(+)传参,也可用-d显示指定字符串所指的日期与时间,%s 表示unix时间戳的秒数

5. 参考:

grep相关
awk相关
shell相关,此为主要参考文章
crontab定时任务相关

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352