Я ищу сценарий (bash / perl / python), который uppon вызывает cron каждые 5 секунд, он проверяет, были ли добавлены новые строки в мои конкретные файлы журнала. Если есть какие-либо новые строки, сценарий должен отправить в корневой каталог уведомление, содержащее событие журнала.
Есть ли способ сделать это?
Вы можете попробовать Тенши. Он написан на Perl, очень прост в настройке и выполняет именно то, что вы просили. Из описания пакета Ubuntu:
«Tenshi - это программа мониторинга журналов, предназначенная для отслеживания в одном или нескольких файлах журналов строк, соответствующих определенным пользователем регулярным выражениям, и отчета о совпадениях. Регулярные выражения назначаются очередям, которые имеют интервал оповещения и список получателей почты».
Пакет Ubuntu (Ссылка на сайт), Пакет Debian (Ссылка на сайт).
Это можно сделать с помощью сценария bash, который выполняет следующие задачи:
tail -f
, записывая вывод в буфер.Я бы использовал один сценарий, возможно, запускаемый как сценарий инициализации, а не задание cron. Например:
#!/bin/bash
RECIPIENT=root
SUBJECT="Log monitor"
PERIOD=5 # Harvest log buffer every PERIOD seconds
# Prepare the log buffer and ensure it is empty
LOGBUFFER=/tmp/logbuffer.$$
cp /dev/null $LOGBUFFER
# Monitor the log files in the background.
# More than one log file can be specified on the command line.
for file in "$@"; do
tail -f -n0 "$file" | while read line;do echo "$file: $line";done >> $LOGBUFFER &
done
# Harvest the log buffer
while :;do
if [ -s $LOGBUFFER ]; then
mail -t "$RECIPIENT" -s "$SUBJECT" < $LOGBUFFER
cp /dev/null $LOGBUFFER
fi
sleep $PERIOD
done
Скрипт не идеален (например, он оставит /tmp/logbuffer.123
файл валяется, когда он выходит), но он должен помочь вам начать.
Если вы рассматриваете возможность перехода на использование syslog-ng, вы можете настроить его для автоматического запуска сценария оболочки, который может запускать электронное письмо на основе шаблона сообщения syslog. У меня есть это для регистрации безопасности.
звонок по cron каждые 5 секунд
Cron не имеет детализации меньше минут. Если вам нужна такая степень детализации, вам понадобится incrond. Просто есть что-то вроде:
/var/log IN_CLOSE_WRITE /usr/local/sbin/notify.sh $@/$#
и сценарий, который отправит вам по почте:
tail $1 | mail -s "New lines in: $1" root
Возможно, вам придется поиграть с нужными событиями. Но это избавит от необходимости запускать сценарий по времени. Если у вас правильно настроен incrontab, вы можете быть уверены, что при запуске скрипта что-то изменится.