![shell 脚本在 cron 范围内进行 grep](https://linux22.com/image/665095/shell%20%E8%84%9A%E6%9C%AC%E5%9C%A8%20cron%20%E8%8C%83%E5%9B%B4%E5%86%85%E8%BF%9B%E8%A1%8C%20grep.png)
我正在尝试创建一个 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
我希望有人能想出比我上面建议的记录保存方法更好的方法。