shell 脚本在 cron 范围内进行 grep

shell 脚本在 cron 范围内进行 grep

我正在尝试创建一个 shell 脚本来查找 的ERROR内部/var/log/jbossas/standalone/server.log,例如以下内容:

# grep ERROR /var/log/jbossas/standalone/server.log
10:36:37,530 ERROR [class X] (ajp-/192.168.X.X:8009-20) THIS IS A TEST
#

脚本将通过 执行cron,因此它必须仅在特定时间范围内查找错误,否则每次执行时都可能会出现重复的电子邮件。

这是我目前的解决方案:

# crontab -l
@hourly     grep ERROR /var/log/jbossas/standalone/server.log | grep `date +%H --date="1 hour ago"`
# 

不幸的是,这个解决方案限制我只能按小时运行。

我想在这里提出问题,看看是否可以找到比我更好的解决方案。

答案1

最好的方法是在处理日志文件之前对其进行旋转或移动。例如,

#cp /path/to/log /path/to/moved_log/log.timestamp && echo > /path/to/log && grep ERROR /path/to/moved_log/log.timestamp

或者,您也可以采用不太受欢迎的方法,计算现有日志文件中的行数并进行处理。将数字存储在某处,然后使用 tail 从最后处理的行开始获取日志中的所有行。

首次执行:

# wc -l /path/to/log > /var/tmp/log.num # grep ERROR /path/to/log

后续执行(在 cron 内部):

tail -n + $(cat /var/tmp/log.num) | grep ERROR wc -l /path/to/log > /var/tmp/log.num

我希望有人能想出比我上面建议的记录保存方法更好的方法。

相关内容