不断监视目录/文件以进行错误报告

时间:2013-12-11 14:07:53

标签: linux bash loops

我需要在目录中查看文件(现有的或新创建的)的更改,并计算日志中ERROR出现的次数。当它看到一个带有OKAY的新行时,它会将错误计数器重置为0(零)。一旦再次在新行中找到ERROR,脚本将继续重复相同的过程。

#!/bin/bash
#
log="/tmp/running.txt"
ref=${log}.ref
TERR=${TERR:-0}

if [ -e $log ]; then
    if [ ! -e $ref ] || find $log -newer $ref | grep . > /dev/null
    then
        touch -r $log $ref
        gStr="tail -1 $log | grep -m1 -Fe 'ERROR'"
        echo -e "[$(date)] #-------------- CHANGE(s) DETECTED --------------#"

        [[ -n $(eval $gStr) ]] \
        && { echo " ---- $(eval $gStr) --- "; export TERR=$(( TERR+1 )); } \
        || { echo -e " ***** It's OKAY now *****"; export TERR=0; }
        echo "Error counter: $TERR"

        echo -e "[$(date)] #-------------- End of Check ---------------#\n"
    fi
fi

我开始使用单个文件(检查,而不是目录中的多个文件),这是我到目前为止所提出的,在捕获ERROR和{{1}方面工作正常在新行中,但在看到OKAY之前无法确定是否记录错误报告的数量。我试着毫不高兴地运行这个scrit OKAY(. ./chkError.sh)似乎不起作用。知道我该怎么做?

另一个相关的问题是,我将这个脚本作为一个cron-job运行,即每分钟运行一次,这可能还不够。我还能做些什么让它在后台运行?欢呼声!!

2 个答案:

答案 0 :(得分:1)

Linux内核包含一个相对便宜的子系统,可以完成这项工作,是最可靠,最经过验证的方法。您在代码中注册了一个“监视”以查找目录中的特定事件,内核会在发生一个事件时通知您,然后您的代码会运行一个函数,然后您可以对该文件执行某些操作。

http://en.wikipedia.org/wiki/Inotify

我意识到您可能不想编写C代码,但是如果您了解这些语言,用Python或Perl编写内容相对容易吗?或者甚至只是一个包装器来注册inotify手表然后触发一个shell脚本。

https://github.com/seb-m/pyinotify

答案 1 :(得分:0)

我会将时间戳保护与增量处理(my 20-liner)结合起来,在您的案例| egrep '^ERROR'中通过可配置的过滤器管道输出,从而报告新的错误。

如果您确实需要接近实时,请在每个文件上运行tail -f xxx.log监视器,并将批处理警报批处理为输出过滤器。