![]() |
Модераторы: powerfox, ZeeLax |
![]() ![]() ![]() |
|
Eugene82 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
Добрый день!
Кто в курсе, подскажите что можно сделать в такой ситуации: Настраиваю почтовый сервер на FreeBSD 7.2 PRERELEASE Хочу скриптом парсить строки падающие в maillog написал для этого в syslog.conf: mail.info | exec /path/to/my_script.sh Написал и положил в /path/to my_script.sh примерно такого содержания
сделал 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) ------------------------- Модернизировал скрипт:
После syslogd reload вижу что в файл свалилась пачка строк плюс "Test" в единственном числе. Затем свалилась ещё пачка строк. Ожидания что строки лога будут чередоваться Test'ом не оправдались. Как сделать чтобы строки передавались скрипту по одной как maillog'у??? Это сообщение отредактировал(а) Eugene82 - 14.5.2009, 15:30 |
||||
|
|||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 34 Всего: 317 |
думаю, что тебе лучше вывод в файл делать не посредством >>, а посредством утилиты работы с логами, тем же logger-ом. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
Eugene82 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
Почитал ман logger'a, протестировал несколько команд. Вот не пойму как писать в конкретный файл отличный от messages и стандартного вывода. Параметр -f я так понял указывает переносить всё что появляется в этом файле в тот же messages и стандартный вывод. ![]() ========================= Потестил: 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 |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 34 Всего: 317 |
ты прав, я промахнулся: никак. logger работает на основе syslog A ты вообще обязан использовать bash ? -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
Eugene82 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
Вообще, нет. Просто пока нет опыта писать под *nix на C :( Использую bash потому что есть небольшой опыт написания скриптов под sh. Да и времени не столько чтобы что-то более серьёзное изучать. Тут диплом на носу - почитать бы про JavaScript и PHP, а приходится с bash'ем заморачиваться. Кстати, а скажи мне пожалуйста, нельзя ли на PHP написать скрипт чтобы делать тоже самое? В PHP есть функция flush().... - Здесь пишут что можно, а примеров нет :( ![]() Это сообщение отредактировал(а) Eugene82 - 19.5.2009, 09:24 |
|||
|
||||
bilbobagginz |
|
||||||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 34 Всего: 317 |
быть может, что это возможно. название php = hypertext preprocessor, т.е. изначально придуман для обработки гипертекста, однако, есть вот эта страница и вот тебе хелло ворлд а ля php:
сохрани как hello, и сделай
запускай:
думаю работа с буфферами там есть, и ты должен быть знаком. я по привычке такие дела делаю на перле или питоне. -------------------- Я ещё не демон. Я только учусь. |
||||||||
|
|||||||||
Eugene82 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 30.5.2005 Где: г. Ростов-на-Дону Репутация: нет Всего: нет |
Спасибо! правда я уже нашёл себе хелоуворлд здесь http://www.phpbuilder.com/columns/darrell20000319.php3 и начал тестировать. Курю так же http://www.php.net/manual/ru/features.commandline.php ![]() ====================== Ушёл на обед и придумал простое решение для своей задачи. Другими средствами. (Дублированием лога и обработкой его в bash awk'ом). Без использования pipe и tail. А через pipe (даже без tail) данные передаются по 4096 байт... И на экран по 4096 байт и в файлы... Так что вопрос о функции flush в bash всё ещё открыт. Это сообщение отредактировал(а) Eugene82 - 19.5.2009, 17:18 |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 34 Всего: 317 |
нет, он не открыт. он давно закрыт. функции flush в bash нету. bash использует настройки псевдо-терминала, которые устанавливаются напр. командой stty, кури Это сообщение отредактировал(а) bilbobagginz - 22.5.2009, 21:00 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Linux/UNIX: Администрирование" | |
|
Этот форум предназначен для решения вопросов по администрации *n?x-систем, в частности по настройке сложных сетей и обслуживанию серверного оборудования.
За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу). В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим. Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Администрирование *NIX систем | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |