V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nutting
V2EX  ›  问与答

shell 监控 tail 文件输出,触发命令?

  •  
  •   nutting · 2017-03-15 10:39:51 +08:00 · 3453 次点击
    这是一个创建于 2837 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有没有运维人员搞过啊,比如我 tail 日志 grep 一个关键字,一旦有输出就触发调用 curl 发送提醒 因为是局方的服务器,没 root ,尽量用系统自带的功能来实现。

    12 条回复    2017-03-15 13:13:06 +08:00
    AntonChen
        1
    AntonChen  
       2017-03-15 10:43:25 +08:00
    很有意思的想法,表示关注
    AntonChen
        2
    AntonChen  
       2017-03-15 10:45:19 +08:00
    补充一下 在我的认知中 tail -f 不断开是做不了后面的操作的,所以我也很想知道能不能实现卤煮的想法
    qooweds
        3
    qooweds  
       2017-03-15 10:52:20 +08:00
    我原来也遇到过,没找到什么好方法
    tail -f xxx |grep > xxx 然后再定时查 xxx 和删除 xxx 这样来做的
    不知道有没有什么直接点的方法
    ruosu0710
        5
    ruosu0710  
       2017-03-15 11:20:30 +08:00
    目前在用的.

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import subprocess
    import time
    import datetime

    from wxnotice import *

    #日志文件是按天产生,则通过在程序中判断文件的产生日期与当前时间,更换监控的日志文件
    def catch(logfile,server):
    print '监控的日志文件是%s' %logfile
    send_notice('od8J4s4pbnj2UTwASk-tKr8hKbEU','异常监控任务启动')
    stoptime=datetime.datetime.combine(datetime.date.today(), datetime.time.max)
    stoptime = time.strftime('%Y-%m-%d %H:%M:%S',stoptime.timetuple())
    print stoptime
    popen = subprocess.Popen('tail -f ' + logfile, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    pid = popen.pid
    print('Popen.pid:' + str(pid))
    while True:
    thistime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))#当前时间
    #print thistime
    if thistime >= stoptime:
    # 终止子进程
    popen.kill()
    print '杀死 subprocess'
    break
    line = popen.stdout.readline().strip()
    # 判断内容是否有异常
    if line.find('Exception')>0:
    line=line+popen.stdout.readline().strip()#
    line=line+popen.stdout.readline().strip()#
    #line=line+popen.stdout.readline().strip()#
    #line=line+popen.stdout.readline().strip()#
    #line=line+popen.stdout.readline().strip()#多读一行.获取更多的异常信息
    openid_array=['od8J4s4pbnj2UTwASk-tKr8hKbEU','od8J4s8xWPDUtrJTXL-bQ9FYias4']
    for openid in openid_array:
    content='['+server+']'+line
    content=content.replace('\"','')
    send_notice(openid,content)#发送微信模板通知给管理员




    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import sys
    from exception import *

    filename= '/data/app/tomcat'+sys.argv[1]+'/logs/catalina.out'
    print filename
    catch(filename,'TOMCAT'+sys.argv[1])
    rrfeng
        6
    rrfeng  
       2017-03-15 11:35:15 +08:00
    tail -f log | while read line; do if [[ `grep KEY $line` ]];then ....fi;done
    shoaly
        7
    shoaly  
       2017-03-15 11:49:34 +08:00
    如果我是来弄的话, 先管道打到我自己的主机上, 全部传过来再说. 有了一份远程的日志的复制, 然后想怎么弄就怎么弄了. 也避免了频繁更新 "局方" 那边 script 的 尴尬.
    tail -f log | ssh 自己人主机 "cat - >> log"
    lululau
        8
    lululau  
       2017-03-15 11:51:03 +08:00
    tail -f log | ruby -ne 'system(CURL_CMD) if /PATTERN/'
    ihuotui
        9
    ihuotui  
       2017-03-15 12:06:24 +08:00 via iPhone
    你需要 elk
    MrMario
        10
    MrMario  
       2017-03-15 12:08:32 +08:00 via iPhone
    楼主你需要 audit ,然后用 elk 收集日志后端分析
    dongxiaozhuo
        11
    dongxiaozhuo  
       2017-03-15 12:25:09 +08:00 via iPhone
    都要监控日志内容并触发报警,为何不和对方谈搞一套日志流程或者监控流程。
    SoloCompany
        12
    SoloCompany  
       2017-03-15 13:13:06 +08:00 via iPhone
    用 tee 应该可以吧,或者直接脚步 while read 循环 一边执行自定义脚本一边输出
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2770 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:23 · PVG 19:23 · LAX 03:23 · JFK 06:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.