Назад | Перейти на главную страницу

сценарий оболочки для grep в пределах диапазона cron

Я пытаюсь создать сценарий оболочки, который будет искать 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"`
# 

к сожалению, это решение ограничивает меня возможностью работать только на почасовой основе.

Я думал, что задам вопрос здесь и посмотрю, смогу ли я найти лучшее решение, чем мое.

Лучшим подходом было бы повернуть или переместить файл журнала ПЕРЕД их обработкой. что-то вроде,

#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

Я надеюсь, что кто-нибудь предложит лучший подход к методу ведения записей, который я предложил выше.