LINUX.ORG.RU

bash, событие на строку в /var/log/messages


0

0

хочу следить за /var/log/messages и при появлении там нужной строки выполнять команду.
чтото похожее на это:

for line in `tail -f /var/log/messages |grep kernel`
do
echo "got $line1"
done

так неработает т.к. tail -f не возвращает конец чтения

как правильно ?

★★★★★

мб так:

perl -e 'open F, "tail -f /var/log/messages |grep kernel|" || die "open"; while (<F>) { print "Got $_"; if (m/string to fiind/) { тут наше действие, например system ("rm -rf /"); } } '

armag
()

tail -f /var/log/messages \
  | awk '/Feb/ { print; fflush() }' \
  | while read -r line; do
      echo "got $line" 
    done

вместо греп поставлен awk вместе с fflush -- это потому что grep или awk без fflush (или close) может буферизировать.

dilmah ★★★★★
()
Ответ на: комментарий от qw3r

спасибо, попробую
с awk пример понравился, буду знать

x905 ★★★★★
() автор топика

#!/usr/bin/perl

use File::Tail;
use strict;

my $name='/var/log/messages';
my $line;

my $file=File::Tail->new(name=>$name);
while (defined($line=$file->read)) {
        print "Got: " . "$line" if ($line =~ /kernel/);
}

sdio ★★★★★
()
Ответ на: комментарий от x905

Как вариант:)

tail -f /var/log/messages | xargs -i sh -c "echo '{}' | grep kernel > /dev/null && echo something"

Delay ★★
()
Ответ на: комментарий от tzukko

Воч не очень канает, потому что у него интервал выполнения команды измеряется в секундах, а события могут происходить гораздо чаще.

xio
()
Ответ на: комментарий от x905

ну это я для примера. Всяких анализаторов куча в сети.

> а события могут происходить гораздо чаще.

в смысле? Тебе нужна бОльшая скорость обнаружения события? Не кажется ли что syslog не очень подходит для IPC? :)

true_admin ★★★★★
()

> хочу следить за /var/log/messages и при появлении там нужной строки выполнять команду.

Так лучше не делать. Тебе явно не за /var/log/messages нужно следить, а за syslog-демоном, который собственно и пишет в /var/log/messages. Например syslog-ng может сам фильтровать поток (например по имени программы) и отправлять лог на сокет (unix или tcp/ip). Если нужно именно на шелле скрипт писать - то заставь syslog-демон писать кроме как в /var/log/messages ещё и в твой fifo. Создай его с помощью mkfifo и читай своим скриптом. Это как минимум избавит от необходимости постоянно проверять изменилось ли содержимое лога и реакция на нужное событие будет намного быстрее.

Deleted
()
Ответ на: комментарий от true_admin

> в смысле? Тебе нужна бОльшая скорость обнаружения события? Не кажется ли что syslog не очень подходит для IPC? :)

Мы может о разных вещах говорим, я же имею в виду, что делать tail -1 | grep ... через watch плохо, ибо за интервал времени между двумя вызовами watch, файл может обновится на количество строк, большее этого интервала. Получается тогда, что программа работает не на каждый раз, а это хуже, чем если бы она вообще не запускалась. Я так один раз написал (http://trac.ungrund.org/dev/browser/adm/logwatch/logwatch.sh#L125) и мне теперь стыдно, лол.

xio
()
Ответ на: комментарий от Deleted

вариант с пайпом знаю, делал на c++ его, но сейчас надо было простое, некритичное к скорости слежение за messages. хотел элегантно сделать его на bash. задержка в данном случаи в секунду, другую приемлима.

x905 ★★★★★
() автор топика
Ответ на: комментарий от x905

> вариант с пайпом знаю, делал на c++ его, но сейчас надо было
> простое, некритичное к скорости слежение за messages. хотел
> элегантно сделать его на bash. задержка в данном случаи в секунду,
> другую приемлима.

Таким способом хоть как не элегантно получается. А вариант fifo и на шелле можно изобразить:

while read l; do
    case "${l}" in
        *substring*)
            # Здесь делаем что-нибудь если строка содержит "substring"
        ;;
        *)
            # Остальные случаи
        ;;
    esac
done < /path/to/fifo

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.