The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"чем парсить постоянно открытый файл?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"чем парсить постоянно открытый файл?"  +/
Сообщение от Alting email(ok) on 26-Янв-11, 14:51 
Коллеги!
Возникла задачка. Есть некий платный софт, которы складывает инфу в csv файлик.
Стоит задача его парсить в реальном времени и складывать инфу в MySQL.
Задача осложняется следующими особенностями:
1. Файл открыт софтом на запись постоянно.
2. Инфа в файл кидается нерегулярно по времени и по объему (построчно не отследишь).
3. Раз в сутки, судя по mtime в произвольное время, имя файла file.csv меняется на file(backup-YYYY-MM-DD).csv - пока отследил, самое раннее в 21.13, самое позднее в 23.59.
4. Софт работает под оффтопиком (со всеми отсюда вытекающими), доступ к csv в настоящее время организован по smb протоколу.

Уф.. Пока в голову приходит только такой вариант:
1. Сделать локальную копию файла.
2. Раз, к примеру, в 5 минут делать diff с удаленным файлом.
3. Изменненную информацию кидать в базу.
4. Делать копию файла.

Есть, конечно, вероятность, что между diff и копированием исходный файл может опять поменяться...

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "чем парсить постоянно открытый файл?"  +/
Сообщение от Vitaly_loki (ok) on 26-Янв-11, 17:36 
>[оверквотинг удален]
> самое позднее в 23.59.
> 4. Софт работает под оффтопиком (со всеми отсюда вытекающими), доступ к csv
> в настоящее время организован по smb протоколу.
> Уф.. Пока в голову приходит только такой вариант:
> 1. Сделать локальную копию файла.
> 2. Раз, к примеру, в 5 минут делать diff с удаленным файлом.
> 3. Изменненную информацию кидать в базу.
> 4. Делать копию файла.
> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
> поменяться...

Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на запись), на другом конце ловите парсером (открывает на чтение)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "чем парсить постоянно открытый файл?"  +/
Сообщение от Alting email(ok) on 27-Янв-11, 08:27 
>[оверквотинг удален]
>> в настоящее время организован по smb протоколу.
>> Уф.. Пока в голову приходит только такой вариант:
>> 1. Сделать локальную копию файла.
>> 2. Раз, к примеру, в 5 минут делать diff с удаленным файлом.
>> 3. Изменненную информацию кидать в базу.
>> 4. Делать копию файла.
>> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
>> поменяться...
> Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на
> запись), на другом конце ловите парсером (открывает на чтение)

Да я не могу ее создать. Файл создается софтом под виндовс. И я не могу заставить его создавать трубу.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "чем парсить постоянно открытый файл?"  +/
Сообщение от Vitaly_loki (ok) on 27-Янв-11, 09:18 
>[оверквотинг удален]
>>> 1. Сделать локальную копию файла.
>>> 2. Раз, к примеру, в 5 минут делать diff с удаленным файлом.
>>> 3. Изменненную информацию кидать в базу.
>>> 4. Делать копию файла.
>>> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
>>> поменяться...
>> Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на
>> запись), на другом конце ловите парсером (открывает на чтение)
> Да я не могу ее создать. Файл создается софтом под виндовс. И
> я не могу заставить его создавать трубу.

Трубу создаете на FreeBSD/Linux, для винды это будет выглядеть как обычный файл, в к-й она будет писать. Я думаю переименовывается он при достижении определенного размера, в случае с трубой такого не случится (если из-за этого конечно). У нее всегда фиксированный размер

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "чем парсить постоянно открытый файл?"  +/
Сообщение от Alting email(ok) on 27-Янв-11, 09:47 
>[оверквотинг удален]
>>>> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
>>>> поменяться...
>>> Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на
>>> запись), на другом конце ловите парсером (открывает на чтение)
>> Да я не могу ее создать. Файл создается софтом под виндовс. И
>> я не могу заставить его создавать трубу.
> Трубу создаете на FreeBSD/Linux, для винды это будет выглядеть как обычный файл,
> в к-й она будет писать. Я думаю переименовывается он при достижении
> определенного размера, в случае с трубой такого не случится (если из-за
> этого конечно). У нее всегда фиксированный размер

Простите, если я правильно ошибаюсь, то порядок моих действий такой:
1. Останавливаю сервис на винде.
2. Удаляю файл csv
3. Монтирую шару на линуксе и создаю трубу с тем же именем, что и файл был на виндовой шаре.
4. Стартую сервис на винде.
Так?
Файл пересоздается раз в сутки а не по достижении определенного размера, к сожалению...
Просто, как и все, что написано под кривую ОС - эти "раз в сутки" софтом понимаются, мягко говоря, фривольно - может в 9 вечера пересоздать, может в полночь. Никаких настроек по точному времени в самом софте, когда переименовывать файл в бэкапный и создавать новый, к сожалению, нет :(
Так что, скорее всего, труба "не прокатит" :(


Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "чем парсить постоянно открытый файл?"  +/
Сообщение от sn (??) on 27-Янв-11, 10:43 
> Файл пересоздается раз в сутки а не по достижении определенного размера, к
> сожалению...
> Просто, как и все, что написано под кривую ОС - эти "раз
> в сутки" софтом понимаются, мягко говоря, фривольно - может в 9
> вечера пересоздать, может в полночь. Никаких настроек по точному времени в
> самом софте, когда переименовывать файл в бэкапный и создавать новый, к
> сожалению, нет :(
> Так что, скорее всего, труба "не прокатит" :(

fifo на подмонтированном в free/lin виндовом разделе и создать наверное не удастся. Предложу запускать парсер так:
tail -f file | parser. Но как обыграть пересоздание файла filе нужно придумать.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "чем парсить постоянно открытый файл?"  +/
Сообщение от Vitaly_loki (ok) on 27-Янв-11, 13:55 
> 1. Останавливаю сервис на винде.
> 2. Удаляю файл csv
> 3. Монтирую шару на линуксе и создаю трубу с тем же именем, что и файл был на виндовой шаре.
> 4. Стартую сервис на винде.
> Так?

Все верно, кроме пункта 3. Надо fifo создать в локальной файловой системе и винде отдать это через SMB-шару

>[оверквотинг удален]
>> Просто, как и все, что написано под кривую ОС - эти "раз
>> в сутки" софтом понимаются, мягко говоря, фривольно - может в 9
>> вечера пересоздать, может в полночь. Никаких настроек по точному времени в
>> самом софте, когда переименовывать файл в бэкапный и создавать новый, к
>> сожалению, нет :(
>> Так что, скорее всего, труба "не прокатит" :(
> fifo на подмонтированном в free/lin виндовом разделе и создать наверное не удастся.
> Предложу запускать парсер так:
> tail -f file | parser. Но как обыграть пересоздание файла filе нужно
> придумать.

Да не-е-е )) fifo создать в директории, к-ю Самба будет отдавать как винд-шару. На винде ее подключить как сетевой диск и пусть софт в нее пишет :) Но остается одна нерешенная трабла - переменование файла

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "чем парсить постоянно открытый файл?"  +/
Сообщение от seeryoga (ok) on 31-Янв-11, 18:23 
> tail -f file | parser. Но как обыграть пересоздание файла filе нужно придумать.

Опция -F работает также, как и опция -f, но tail также будет проверять, не был ли отслеживаемый файл переименован или обновлён. Файл закрывается и открывается снова, если tail обнаружит, что файл имеет новый номер индексного дескриптора (inode).
Это то, что нужно.

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

8. "чем парсить постоянно открытый файл?"  +/
Сообщение от Alting email(ok) on 01-Фев-11, 09:54 
>> tail -f file | parser. Но как обыграть пересоздание файла filе нужно придумать.
> Опция -F работает также, как и опция -f, но tail также будет
> проверять, не был ли отслеживаемый файл переименован или обновлён. Файл закрывается
> и открывается снова, если tail обнаружит, что файл имеет новый номер
> индексного дескриптора (inode).
> Это то, что нужно.

Спасибо за наводочку...
Вот еще бы как-то заставить этот тупой софт писать по строчке в единицу времени... А не кидать скопом разное количество строк в произвольную единицу времени...
Вот только, если я правильно ошибаюсь, инод в ntfs нету... Или есть?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "чем парсить постоянно открытый файл?"  +/
Сообщение от sn (??) on 01-Фев-11, 10:56 
> Вот еще бы как-то заставить этот тупой софт писать по строчке в
> единицу времени... А не кидать скопом разное количество строк в произвольную
> единицу времени...

Может еще и парсер нам для тебя написать :(

> Вот только, если я правильно ошибаюсь, инод в ntfs нету... Или есть?

inode и не нужен.
вот что в мане написано:

        With  --follow  (-f),  tail  defaults to following the file descriptor, which means
       that even if a tail'ed file is renamed, tail will continue to track its end.   This
       default  behavior is not desirable when you really want to track the actual name of
       the file, not the file descriptor (e.g., log rotation).  Use --follow=name in  that
       case.   That  causes tail to track the named file in a way that accommodates renam-
       ing, removal and creation.


Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "чем парсить постоянно открытый файл?"  +/
Сообщение от Alting email(ok) on 01-Фев-11, 11:23 
>> Вот еще бы как-то заставить этот тупой софт писать по строчке в
>> единицу времени... А не кидать скопом разное количество строк в произвольную
>> единицу времени...
> Может еще и парсер нам для тебя написать :(

Ну мы с Вами вроде еще на брудершафт не пили?

>[оверквотинг удален]
> file is renamed, tail will continue to track its end.  
>  This
>        default  behavior is not
> desirable when you really want to track the actual name of
>        the file, not the file
> descriptor (e.g., log rotation).  Use --follow=name in  that
>        case.   That  
> causes tail to track the named file in a way that
> accommodates renam-
>        ing, removal and creation.

Парсер я писать не просил. За наводку спасибо!


Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "чем парсить постоянно открытый файл?"  +/
Сообщение от seeryoga (ok) on 01-Фев-11, 16:30 
> Спасибо за наводочку...
> Вот еще бы как-то заставить этот тупой софт писать по строчке в
> единицу времени... А не кидать скопом разное количество строк в произвольную единицу времени...
> Вот только, если я правильно ошибаюсь, инод в ntfs нету... Или есть?

NTFS использует файловые записи - это подобие inode, и если я правильно ошибаюсь, вас интересовать это не должно, т.к. это забота О.С.
И как поступает инфа из софта тоже не важно. Главное использовать опцию -F (если система *BSD)


Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

12. "чем парсить постоянно открытый файл?"  +/
Сообщение от Alting email(ok) on 02-Фев-11, 11:45 
>> Спасибо за наводочку...
>> Вот еще бы как-то заставить этот тупой софт писать по строчке в
>> единицу времени... А не кидать скопом разное количество строк в произвольную единицу времени...
>> Вот только, если я правильно ошибаюсь, инод в ntfs нету... Или есть?
> NTFS использует файловые записи - это подобие inode, и если я правильно
> ошибаюсь, вас интересовать это не должно, т.к. это забота О.С.
> И как поступает инфа из софта тоже не важно. Главное использовать опцию
> -F (если система *BSD)

Ага, попробовал. Оставил на ночь, в tail-е появились строчки, что файл изменен и парсит дальше.
Буду теперь чистить от мусора вывод, спасибо за ключик :)
P.S. система, кстати, линукс, но работает!

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру