URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9013
[ Назад ]

Исходное сообщение
"чем парсить постоянно открытый файл?"

Отправлено Alting , 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 и копированием исходный файл может опять поменяться...


Содержание

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

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


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

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


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

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


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

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



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

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


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

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

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

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


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

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


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

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


"чем парсить постоянно открытый файл?"
Отправлено sn , 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.



"чем парсить постоянно открытый файл?"
Отправлено Alting , 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.

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



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

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



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

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