Коллеги!
Возникла задачка. Есть некий платный софт, которы складывает инфу в 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 и копированием исходный файл может опять поменяться...
>[оверквотинг удален]
> самое позднее в 23.59.
> 4. Софт работает под оффтопиком (со всеми отсюда вытекающими), доступ к csv
> в настоящее время организован по smb протоколу.
> Уф.. Пока в голову приходит только такой вариант:
> 1. Сделать локальную копию файла.
> 2. Раз, к примеру, в 5 минут делать diff с удаленным файлом.
> 3. Изменненную информацию кидать в базу.
> 4. Делать копию файла.
> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
> поменяться...Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на запись), на другом конце ловите парсером (открывает на чтение)
>[оверквотинг удален]
>> в настоящее время организован по smb протоколу.
>> Уф.. Пока в голову приходит только такой вариант:
>> 1. Сделать локальную копию файла.
>> 2. Раз, к примеру, в 5 минут делать diff с удаленным файлом.
>> 3. Изменненную информацию кидать в базу.
>> 4. Делать копию файла.
>> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
>> поменяться...
> Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на
> запись), на другом конце ловите парсером (открывает на чтение)Да я не могу ее создать. Файл создается софтом под виндовс. И я не могу заставить его создавать трубу.
>[оверквотинг удален]
>>> 1. Сделать локальную копию файла.
>>> 2. Раз, к примеру, в 5 минут делать diff с удаленным файлом.
>>> 3. Изменненную информацию кидать в базу.
>>> 4. Делать копию файла.
>>> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
>>> поменяться...
>> Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на
>> запись), на другом конце ловите парсером (открывает на чтение)
> Да я не могу ее создать. Файл создается софтом под виндовс. И
> я не могу заставить его создавать трубу.Трубу создаете на FreeBSD/Linux, для винды это будет выглядеть как обычный файл, в к-й она будет писать. Я думаю переименовывается он при достижении определенного размера, в случае с трубой такого не случится (если из-за этого конечно). У нее всегда фиксированный размер
>[оверквотинг удален]
>>>> Есть, конечно, вероятность, что между diff и копированием исходный файл может опять
>>>> поменяться...
>>> Создайте трубу (man mkfifo) в один конец трубы пишет софт (открывает на
>>> запись), на другом конце ловите парсером (открывает на чтение)
>> Да я не могу ее создать. Файл создается софтом под виндовс. И
>> я не могу заставить его создавать трубу.
> Трубу создаете на FreeBSD/Linux, для винды это будет выглядеть как обычный файл,
> в к-й она будет писать. Я думаю переименовывается он при достижении
> определенного размера, в случае с трубой такого не случится (если из-за
> этого конечно). У нее всегда фиксированный размерПростите, если я правильно ошибаюсь, то порядок моих действий такой:
1. Останавливаю сервис на винде.
2. Удаляю файл csv
3. Монтирую шару на линуксе и создаю трубу с тем же именем, что и файл был на виндовой шаре.
4. Стартую сервис на винде.
Так?
Файл пересоздается раз в сутки а не по достижении определенного размера, к сожалению...
Просто, как и все, что написано под кривую ОС - эти "раз в сутки" софтом понимаются, мягко говоря, фривольно - может в 9 вечера пересоздать, может в полночь. Никаких настроек по точному времени в самом софте, когда переименовывать файл в бэкапный и создавать новый, к сожалению, нет :(
Так что, скорее всего, труба "не прокатит" :(
> Файл пересоздается раз в сутки а не по достижении определенного размера, к
> сожалению...
> Просто, как и все, что написано под кривую ОС - эти "раз
> в сутки" софтом понимаются, мягко говоря, фривольно - может в 9
> вечера пересоздать, может в полночь. Никаких настроек по точному времени в
> самом софте, когда переименовывать файл в бэкапный и создавать новый, к
> сожалению, нет :(
> Так что, скорее всего, труба "не прокатит" :(fifo на подмонтированном в free/lin виндовом разделе и создать наверное не удастся. Предложу запускать парсер так:
tail -f file | parser. Но как обыграть пересоздание файла filе нужно придумать.
> 1. Останавливаю сервис на винде.
> 2. Удаляю файл csv
> 3. Монтирую шару на линуксе и создаю трубу с тем же именем, что и файл был на виндовой шаре.
> 4. Стартую сервис на винде.
> Так?Все верно, кроме пункта 3. Надо fifo создать в локальной файловой системе и винде отдать это через SMB-шару
>[оверквотинг удален]
>> Просто, как и все, что написано под кривую ОС - эти "раз
>> в сутки" софтом понимаются, мягко говоря, фривольно - может в 9
>> вечера пересоздать, может в полночь. Никаких настроек по точному времени в
>> самом софте, когда переименовывать файл в бэкапный и создавать новый, к
>> сожалению, нет :(
>> Так что, скорее всего, труба "не прокатит" :(
> fifo на подмонтированном в free/lin виндовом разделе и создать наверное не удастся.
> Предложу запускать парсер так:
> tail -f file | parser. Но как обыграть пересоздание файла filе нужно
> придумать.Да не-е-е )) fifo создать в директории, к-ю Самба будет отдавать как винд-шару. На винде ее подключить как сетевой диск и пусть софт в нее пишет :) Но остается одна нерешенная трабла - переменование файла
> tail -f file | parser. Но как обыграть пересоздание файла filе нужно придумать.Опция -F работает также, как и опция -f, но tail также будет проверять, не был ли отслеживаемый файл переименован или обновлён. Файл закрывается и открывается снова, если tail обнаружит, что файл имеет новый номер индексного дескриптора (inode).
Это то, что нужно.
>> tail -f file | parser. Но как обыграть пересоздание файла filе нужно придумать.
> Опция -F работает также, как и опция -f, но tail также будет
> проверять, не был ли отслеживаемый файл переименован или обновлён. Файл закрывается
> и открывается снова, если tail обнаружит, что файл имеет новый номер
> индексного дескриптора (inode).
> Это то, что нужно.Спасибо за наводочку...
Вот еще бы как-то заставить этот тупой софт писать по строчке в единицу времени... А не кидать скопом разное количество строк в произвольную единицу времени...
Вот только, если я правильно ошибаюсь, инод в ntfs нету... Или есть?
> Вот еще бы как-то заставить этот тупой софт писать по строчке в
> единицу времени... А не кидать скопом разное количество строк в произвольную
> единицу времени...Может еще и парсер нам для тебя написать :(
> Вот только, если я правильно ошибаюсь, инод в 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.
>> Вот еще бы как-то заставить этот тупой софт писать по строчке в
>> единицу времени... А не кидать скопом разное количество строк в произвольную
>> единицу времени...
> Может еще и парсер нам для тебя написать :(Ну мы с Вами вроде еще на брудершафт не пили?
>[оверквотинг удален]
> 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.Парсер я писать не просил. За наводку спасибо!
> Спасибо за наводочку...
> Вот еще бы как-то заставить этот тупой софт писать по строчке в
> единицу времени... А не кидать скопом разное количество строк в произвольную единицу времени...
> Вот только, если я правильно ошибаюсь, инод в ntfs нету... Или есть?NTFS использует файловые записи - это подобие inode, и если я правильно ошибаюсь, вас интересовать это не должно, т.к. это забота О.С.
И как поступает инфа из софта тоже не важно. Главное использовать опцию -F (если система *BSD)
>> Спасибо за наводочку...
>> Вот еще бы как-то заставить этот тупой софт писать по строчке в
>> единицу времени... А не кидать скопом разное количество строк в произвольную единицу времени...
>> Вот только, если я правильно ошибаюсь, инод в ntfs нету... Или есть?
> NTFS использует файловые записи - это подобие inode, и если я правильно
> ошибаюсь, вас интересовать это не должно, т.к. это забота О.С.
> И как поступает инфа из софта тоже не важно. Главное использовать опцию
> -F (если система *BSD)Ага, попробовал. Оставил на ночь, в tail-е появились строчки, что файл изменен и парсит дальше.
Буду теперь чистить от мусора вывод, спасибо за ключик :)
P.S. система, кстати, линукс, но работает!