| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Администрирование *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 примерно такого содержания
сделал 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 15.5.2009, 09:00 | ||
Почитал ман 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 байт. Уж не выводятся ли данные только если их размер превышает размер страницы памяти??? И что с этим делать? В смысле как побороть - как выгружать данные из страницы памяти на диск даже когда она не заполнилась? |
| Автор: bilbobagginz 19.5.2009, 00:54 | ||
ты прав, я промахнулся: никак. logger работает на основе syslog A ты вообще обязан использовать bash ? |
| Автор: Eugene82 19.5.2009, 08:38 | ||
Вообще, нет. Просто пока нет опыта писать под *nix на C :( Использую bash потому что есть небольшой опыт написания скриптов под sh. Да и времени не столько чтобы что-то более серьёзное изучать. Тут диплом на носу - почитать бы про JavaScript и PHP, а приходится с bash'ем заморачиваться. Кстати, а скажи мне пожалуйста, нельзя ли на PHP написать скрипт чтобы делать тоже самое? В PHP есть функция flush()....
|
| Автор: bilbobagginz 19.5.2009, 10:38 | ||||||||
быть может, что это возможно. название php = hypertext preprocessor, т.е. изначально придуман для обработки гипертекста, однако, есть вот http://www.php.net/manual/en/features.commandline.php и вот тебе хелло ворлд а ля php:
сохрани как hello, и сделай
запускай:
думаю работа с буфферами там есть, и ты должен быть знаком. я по привычке такие дела делаю на перле или питоне. |
| Автор: Eugene82 19.5.2009, 10:52 |
Спасибо! правда я уже нашёл себе хелоуворлд здесь 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 всё ещё открыт. |
| Автор: bilbobagginz 22.5.2009, 20:59 |
нет, он не открыт. он давно закрыт. функции flush в bash нету. bash использует настройки псевдо-терминала, которые устанавливаются напр. командой stty, http://www.gsp.com/cgi-bin/man.cgi?section=1&topic=stty |