Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Flush file command в bash, Есть ли команда flush в bash? 
:(
    Опции темы
Eugene82
  Дата 14.5.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Добрый день!

Кто в курсе, подскажите что можно сделать в такой ситуации:
Настраиваю почтовый сервер на 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'у???

Это сообщение отредактировал(а) Eugene82 - 14.5.2009, 15:30
PM WWW ICQ   Вверх
bilbobagginz
Дата 14.5.2009, 20:29 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 34
Всего: 317



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

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



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Eugene82
  Дата 15.5.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(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 байт. 

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

Это сообщение отредактировал(а) Eugene82 - 18.5.2009, 13:36
PM WWW ICQ   Вверх
bilbobagginz
Дата 19.5.2009, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 34
Всего: 317



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

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




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Eugene82
  Дата 19.5.2009, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



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

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

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

 - Здесь пишут что можно, а примеров нет :(  smile 

Это сообщение отредактировал(а) Eugene82 - 19.5.2009, 09:24
PM WWW ICQ   Вверх
bilbobagginz
Дата 19.5.2009, 10:38 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 34
Всего: 317



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

быть может, что это возможно.
название php = hypertext preprocessor, т.е. изначально придуман для обработки гипертекста, 
однако, есть вот эта страница
и вот тебе хелло ворлд а ля php:
Код

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

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

chmod +x hello

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

./hello


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




--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
Eugene82
Дата 19.5.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 30.5.2005
Где: г. Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(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 всё ещё открыт.

Это сообщение отредактировал(а) Eugene82 - 19.5.2009, 17:18
PM WWW ICQ   Вверх
bilbobagginz
Дата 22.5.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 34
Всего: 317



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

нет, он не открыт. он давно закрыт. 
функции flush в bash нету. 
bash использует настройки псевдо-терминала, которые устанавливаются напр. командой stty, кури


Это сообщение отредактировал(а) bilbobagginz - 22.5.2009, 21:00


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Администрирование"
ZeeLax
Imple
nerezus
Этот форум предназначен для решения вопросов по администрации *n?x-систем, в частности по настройке сложных сетей и обслуживанию серверного оборудования.

  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Администрирование *NIX систем | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.