Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Администрирование *NIX систем > Flush file command в bash


Автор: Eugene82 14.5.2009, 14:51
Добрый день!

Кто в курсе, подскажите что можно сделать в такой ситуации:
Настраиваю почтовый сервер на FreeBSD 7.2 PRERELEASE

Хочу скриптом парсить строки падающие в maillog

написал для этого в syslog.conf:
mail.info               | exec /path/to/my_script.sh

Написал и положил в /path/to my_script.sh примерно такого содержания
Код

!#/usr/bin/env bash

cat - | awk '/NOQUEUE/' >> /path/to/some.file


сделал
touch /path/to/some.file
tail -f /path/to/some.file

После syslogd reload замечаю что строки в /path/to/some.file попадают, но как-то криво: падают туда пачками, часто последняя строка отображается не полностью (может она так и в файл пишется?). Между попаданием строк в файл проходит значительное время, хотя анализируя реальный maillog вижу что попадающие под шаблон строки попадаются чаще. В процессах вижу мой скрипт: bash /path/to/my_script.sh - по PID'у понял что скрипт запускается один раз и работает, а не каждый раз когда в лог попадает строка. Заметил ещё что при перезапуске syslogd в /path/to/some.file сразу появляется много строк. Подозреваю что во время ">> /path/to/some.file" строки помещаются в буфер оперативной памяти, и реально записываются в файл /path/to/some.file по мере наполнения буфера или при перезапуске скрипта или демона. 

В связи с этим вопрос по сабжу. Есть ли в bash средства для записи буфера в файл?
Или может у меня другая проблема? Кто-нибудь с таким сталкивался?

В мане по syslogd или syslog.conf написано что демон сислог для немедленной записи в файл использует некую функцию fsync().
(Её использование можно отменить в syslog.conf добавив минус перед именем файла mail.info -/var/log/maillog)

-------------------------

Модернизировал скрипт: 
Код

!#/usr/bin/env bash

cat - | awk '/NOQUEUE/' >> /path/to/some.file
echo Test >> /path/to/some.file

После syslogd reload вижу что в файл свалилась пачка строк плюс "Test" в единственном числе. Затем свалилась ещё пачка строк. Ожидания что строки лога будут чередоваться Test'ом не оправдались.

Как сделать чтобы строки передавались скрипту по одной как maillog'у???

Автор: bilbobagginz 14.5.2009, 20:29
Цитата(Eugene82 @  14.5.2009,  14:51 Найти цитируемый пост)
Как сделать чтобы строки передавались скрипту по одной как maillog'у???

думаю, что тебе лучше вывод в файл делать не посредством >>, а посредством утилиты работы с логами, тем же logger-ом.

Автор: Eugene82 15.5.2009, 09:00
Цитата(bilbobagginz @  14.5.2009,  20:29 Найти цитируемый пост)
думаю, что тебе лучше вывод в файл делать не посредством >>, а посредством утилиты работы с логами, тем же logger-ом.

Почитал ман logger'a, протестировал несколько команд. Вот не пойму как писать в конкретный файл отличный от messages и стандартного вывода. Параметр -f я так понял указывает переносить всё что появляется в этом файле в тот же messages и стандартный вывод.  smile 


=========================

Потестил:

tail -f /var/log/maillog | awk '/NOQUEUE/ && /Recipient/' | awk -F[ '{print $3}' | awk -F] '{print $1}'
и
tail -f /var/log/maillog | awk '/NOQUEUE/ && /Recipient/' | awk -F[ '{print $3}' | awk -F] '{print $1}' >> /tmp/test
заметил что в первом случае вывод происходит совсем не сразу хотя подходящие строки в майллоге попадаются, выводится некоторым блоком
во втором случае записи в файле появляются так же блоками - причём заметил их размер 4096 байт. 

Уж не выводятся ли данные только если их размер превышает размер страницы памяти???
И что с этим делать? В смысле как побороть - как выгружать данные из страницы памяти на диск даже когда она не заполнилась?

Автор: bilbobagginz 19.5.2009, 00:54
Цитата(Eugene82 @  15.5.2009,  09:00 Найти цитируемый пост)
Вот не пойму как писать в конкретный файл отличный от messages и стандартного вывода.

ты прав, я промахнулся: никак. logger работает на основе syslog
A ты вообще обязан использовать bash ?


Автор: Eugene82 19.5.2009, 08:38
Цитата(bilbobagginz @  19.5.2009,  00:54 Найти цитируемый пост)
A ты вообще обязан использовать bash ?

Вообще, нет. Просто пока нет опыта писать под *nix на C :( Использую bash потому что есть небольшой опыт написания скриптов под sh. Да и времени не столько чтобы что-то более серьёзное изучать. Тут диплом на носу - почитать бы про JavaScript и PHP, а приходится с bash'ем заморачиваться.

Кстати, а скажи мне пожалуйста, нельзя ли на PHP написать скрипт чтобы делать тоже самое? В PHP есть функция flush().... 

Цитата(http://ru.wikipedia.org/wiki/PHP)
http://ru.wikipedia.org/wiki/PHP#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_PHP
 - Здесь пишут что можно, а примеров нет :(  smile 

Автор: bilbobagginz 19.5.2009, 10:38
Цитата(Eugene82 @  19.5.2009,  08:38 Найти цитируемый пост)
Кстати, а скажи мне пожалуйста, нельзя ли на PHP написать скрипт чтобы делать тоже самое? 

быть может, что это возможно.
название php = hypertext preprocessor, т.е. изначально придуман для обработки гипертекста, 
однако, есть вот http://www.php.net/manual/en/features.commandline.php
и вот тебе хелло ворлд а ля php:
Код

#!/usr/bin/env php
<?
    $name = "Anonymous";
    if ($argc>1){
        $name = $argv[1];
    }
    echo "Hello, $name\n";
?>

сохрани как hello, и сделай 
Код

chmod +x hello

запускай:
Код

./hello


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


Автор: Eugene82 19.5.2009, 10:52
Цитата(bilbobagginz @  19.5.2009,  10:38 Найти цитируемый пост)
и вот тебе хелло ворлд а ля php:

Спасибо!
правда я уже нашёл себе хелоуворлд здесь http://www.phpbuilder.com/columns/darrell20000319.php3 и начал тестировать.

Курю так же http://www.php.net/manual/ru/features.commandline.php  smile 

======================
Ушёл на обед и придумал простое решение для своей задачи. Другими средствами. (Дублированием лога и обработкой его в bash awk'ом). Без использования pipe и tail.

А через pipe (даже без tail) данные передаются по 4096 байт... И на экран по 4096 байт и в файлы...

Так что вопрос о функции flush в bash всё ещё открыт.

Автор: bilbobagginz 22.5.2009, 20:59
Цитата(Eugene82 @  19.5.2009,  10:52 Найти цитируемый пост)
Так что вопрос о функции flush в bash всё ещё открыт.

нет, он не открыт. он давно закрыт. 
функции flush в bash нету. 
bash использует настройки псевдо-терминала, которые устанавливаются напр. командой stty, http://www.gsp.com/cgi-bin/man.cgi?section=1&topic=stty

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)