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

2017-03-15 10:39:51 +08:00
 nutting

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

3457 次点击
所在节点    问与答
12 条回复
AntonChen
2017-03-15 10:43:25 +08:00
很有意思的想法,表示关注
AntonChen
2017-03-15 10:45:19 +08:00
补充一下 在我的认知中 tail -f 不断开是做不了后面的操作的,所以我也很想知道能不能实现卤煮的想法
qooweds
2017-03-15 10:52:20 +08:00
我原来也遇到过,没找到什么好方法
tail -f xxx |grep > xxx 然后再定时查 xxx 和删除 xxx 这样来做的
不知道有没有什么直接点的方法
hcymk2
2017-03-15 11:01:25 +08:00
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
2017-03-15 11:35:15 +08:00
tail -f log | while read line; do if [[ `grep KEY $line` ]];then ....fi;done
shoaly
2017-03-15 11:49:34 +08:00
如果我是来弄的话, 先管道打到我自己的主机上, 全部传过来再说. 有了一份远程的日志的复制, 然后想怎么弄就怎么弄了. 也避免了频繁更新 "局方" 那边 script 的 尴尬.
tail -f log | ssh 自己人主机 "cat - >> log"
lululau
2017-03-15 11:51:03 +08:00
tail -f log | ruby -ne 'system(CURL_CMD) if /PATTERN/'
ihuotui
2017-03-15 12:06:24 +08:00
你需要 elk
MrMario
2017-03-15 12:08:32 +08:00
楼主你需要 audit ,然后用 elk 收集日志后端分析
dongxiaozhuo
2017-03-15 12:25:09 +08:00
都要监控日志内容并触发报警,为何不和对方谈搞一套日志流程或者监控流程。
SoloCompany
2017-03-15 13:13:06 +08:00
用 tee 应该可以吧,或者直接脚步 while read 循环 一边执行自定义脚本一边输出

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/347556

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX