bash скрипт для бесконечного парсинга лога

Добрый день.

Есть астериск на котором летит debug в лог. В день примерно 1.2-2.0 гига.
Надо отлавливать определенные события и делать с ними всякое.

Корректно ли сделать tail -f с проверкой if прилетающих строк на события?

типа tail -f | while read n; do
if [ парсинг строки совпал с error ]; then blabla
elseif [ парсинг строки совпал и тд

Или правильнее ротировать лог каждые пять минут, проверять получившийся кусок и проверять следующий?
Возможная проблема такой реализации – в случае ротации лога без ведома вашего скрипта, старый лог будет переименован, а новый заново создан, при этом ваш скрипт останется "висеть" на старом, потому что после открытия файла он привязан уже не к имени, а к дескриптору файла, который при переименовании не меняется.
Natrio
Возможная проблема такой реализации – в случае ротации лога без ведома вашего скрипта, старый лог будет переименован, а новый заново создан, при этом ваш скрипт останется "висеть" на старом, потому что после открытия файла он привязан уже не к имени, а к дескриптору файла, который при переименовании не меняется.

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

работает
tail -f somelog | while read n do; lalal

#!/bin/bash
SLC () {
logger 'CONNECTION'
}
SLD () {
logger 'DISCONNECTED'
}
tail -f /var/log/asterisk/full | while read n; do
	if [ "`echo $n | grep -o 'connection$'`" = "connection" ]; then SLC && continue
	elif [ "`echo $n | grep -o 'disconnected$'`" = "disconnected" ]; then SLD
	fi;
done

(помню про дескриптор, это пока за рамками)

периодически в лог прилетает 20к строчек (не попадающие под выборку, тоесть чисто операции сравнения). скрипт занимает 10-11 процентов проца, секунд этак на 60 )
можно как то оптимизировать процесс сравнения?
7-8 условий сравнения это процесс удлинят по времени огого.
Для сравнения строк есть специальные операции проверки, встроенные в баш.

Если пользоваться регулярными выражениями, это можно сделать так:
if [[ $n =~ connection$ ]] ; then SLC
elif [[ $n =~ disconnected$ ]] ; then SLD
fi
Если по простым маскам, то так:
case "$n" in
*connection) SLC ;;
*disconnected) SLD ;;
esac
Natrio
Для сравнения строк есть специальные операции проверки, встроенные в баш.

Если пользоваться регулярными выражениями, это можно сделать так:
if [[ $n =~ connection$ ]] ; then SLC
elif [[ $n =~ disconnected$ ]] ; then SLD
fi
Если по простым маскам, то так:
case "$n" in
*connection) SLC ;;
*disconnected) SLD ;;
esac

спасибо, в очередной раз )

c регулярками тот же объем отработал за 5 секунд, ядро нагрузило до 47 процентов.
а еще меня потыкали в мануал tail

tail -F same as --follow=name --retry
With --follow (-f), tail defaults to following the file descriptor, which means that even if a tail'ed file is renamed, tail will continue to track its end. This default behavior is not desirable
when you really want to track the actual name of the file, not the file descriptor (e.g., log rotation). Use --follow=name in that case. That causes tail to track the named file in a way that
accommodates renaming, removal and creation.
 
Зарегистрироваться или войдите чтобы оставить сообщение.