我需要在目录中查看文件(现有的或新创建的)的更改,并计算日志中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运行,即每分钟运行一次,这可能还不够。我还能做些什么让它在后台运行?欢呼声!!
答案 0 :(得分:1)
Linux内核包含一个相对便宜的子系统,可以完成这项工作,是最可靠,最经过验证的方法。您在代码中注册了一个“监视”以查找目录中的特定事件,内核会在发生一个事件时通知您,然后您的代码会运行一个函数,然后您可以对该文件执行某些操作。
http://en.wikipedia.org/wiki/Inotify
我意识到您可能不想编写C代码,但是如果您了解这些语言,用Python或Perl编写内容相对容易吗?或者甚至只是一个包装器来注册inotify手表然后触发一个shell脚本。
答案 1 :(得分:0)
我会将时间戳保护与增量处理(my 20-liner)结合起来,在您的案例| egrep '^ERROR'
中通过可配置的过滤器管道输出,从而报告新的错误。
如果您确实需要接近实时,请在每个文件上运行tail -f xxx.log
监视器,并将批处理警报批处理为输出过滤器。