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 не возвращает конец чтения

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

★★★★★

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

мб так:

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 ()

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

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 ★★★★★ ()

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

tail -f /var/log/messages | grep kernel | while read line
do
echo "Got $line"
done

так работает

qw3r ()

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

#!/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 ★★★★★ ()
Ответ на: Re: bash, событие на строку в /var/log/messages от tzukko

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

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

xio ()
Ответ на: Re: bash, событие на строку в /var/log/messages от x905

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

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

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

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

true_admin ★★★★★ ()

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

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

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

Deleted ()
Ответ на: Re: bash, событие на строку в /var/log/messages от true_admin

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

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

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

xio ()
Ответ на: Re: bash, событие на строку в /var/log/messages от Deleted

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

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

x905 ★★★★★ ()
Ответ на: Re: bash, событие на строку в /var/log/messages от x905

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

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

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

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

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