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



我需要查看目录中文件(现有或新建)的更改,并计算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

我从一个文件开始(检查,而不是目录中的多个文件),这就是我到目前为止所做的,它在新行中捕获ERROROKAY方面运行良好,但在看到OKAY之前,无法跟踪错误报告的数量。我试着在没有任何乐趣的情况下运行这个scrit (. ./chkError.sh)TERR=$((TERR+1))似乎不起作用。知道我该怎么做吗?

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

linux内核包含一个相对便宜的子系统来完成这项工作,并且是实现您想要的功能的最可靠和最可靠的方法。您可以在代码中注册一个"watch"来查找目录中的特定事件,内核会在事件发生时通知您,然后您的代码运行一个函数,然后您可以对该文件执行某些操作。

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

我意识到你可能不想写C代码,但如果你知道这些语言的话,用Python或Perl写东西是相对容易的?甚至只是一个包装器来注册inotify手表,然后触发一个shell脚本。

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

我会将时间戳保护与增量处理(我的20行)相结合,通过一个可配置的过滤器(在您的情况下是| egrep '^ERROR')传输输出,从而只报告新的错误。

如果你真的需要让它接近实时,那么在每个文件上运行tail -f xxx.log监视器,并将警报批处理合并为输出过滤器。

最新更新