Как мой демон Linux может узнать, когда программа Windows перестала писать файл, к которому я обращаюсь через SAMBA? - PullRequest
5 голосов
/ 25 февраля 2010

Я разрабатываю систему, которая взаимодействует с комплектом поставки USPS под названием Dazzle. Часть этой системы включает в себя демон мониторинга, целью которого является получение файлов значений, разделенных табуляцией, превращение их в XML, распознаваемый Dazzle, и передача их в Dazzle для создания меток. И эта часть работает просто отлично. Однако я также хочу проанализировать выходной файл, который генерирует Dazzle, и импортировать его в базу данных.

Обратите внимание, что Dazzle работает в Windows. Мой демон мониторинга написан на Perl и работает в Linux. В моей системе Linux есть каталоги ввода и вывода Dazzle, смонтированные через Samba.

Измеримая задержка между моментом, когда Dazzle начинает записывать выходной файл, и временем, когда он заканчивается. Что я хочу знать, так это как я могу ждать, пока Dazzle закончит запись выходного файла? Я попытался открыть файл и сделать flock($fh, LOCK_SH), но это не принесло пользы.

РЕДАКТИРОВАТЬ : У меня есть идея, основанная на комментарии "mobrule" ниже. Dazzle записывает выходной файл в формате XML. Каждая посылка в упаковке заключена в теги, а весь документ - в тег. Поэтому, если я начну читать файл до его завершения, я могу просто подождать соответствующий закрывающий тег, прежде чем предпринять какие-либо действия.

Кроме того, я должен упомянуть, что я делаю в настоящее время. Когда я обнаруживаю, что выходной XML-файл создан, я пытаюсь его проанализировать. Если это не удастся, я сплю и попробую еще раз. Если это не помогло, я сплю вдвое дольше, потом попробую еще раз и так далее. Это хорошо сработало при тестировании с тайм-аутом в 64 секунды.

Ответы [ 4 ]

5 голосов
/ 25 февраля 2010

Не существует общего и портативного способа определить, есть ли у какого-либо процесса открытый дескриптор файла для какого-либо произвольного файла. Вы должны сделать суждение с вашим местным знанием ситуации.

В этом случае может оказаться возможным запросить таблицу процессов на компьютере с Windows, чтобы узнать, работает ли еще программа «Dazzle». Или, возможно, ваш опыт дает вам другие рекомендации, такие как «Dazzle никогда не требует больше 20 секунд для запуска, когда ввод разумный» или «когда Dazzle работает, он обновляет файл каждые пару секунд. Если файл не был обновлен скажем, через 10 секунд, есть очень хороший шанс, что Dazzle закончен. "

Но вам не обязательно ждать, пока Dazzle не закончится. Вполне нормально читать файл в то время, когда Dazzle пишет в него - смотрите perldoc для функции seek , обращая внимание на часть о том, «как эмулировать tail -f». Затем вы можете обновить базу данных, пока Dazzle работает.

Таким образом, если вы слишком консервативны в угадывании, когда Dazzle завершит свою работу, ваша база данных все равно будет своевременно обновляться, и единственными издержками будут некоторые бесполезные вызовы поиска и чтения для файлового дескриптора в EOF.

1 голос
/ 25 февраля 2010

Вы можете попробовать сделать блокировку с LOCK_EX - и если блокировка не удалась, это означает, что она все еще записывается. Вращайте так, пока не получите замок, и ослепление должно быть сделано. Это не получится, если Dazzle закроет файл и снова откроет его в режиме добавления, так что это не лучшее решение.

1 голос
/ 25 февраля 2010

Возможно, вы можете заставить Dazzle записать фиктивный файл или файл флага (он может содержать все, что вы захотите, например, отметку даты / времени или порядковый номер), чтобы указать, что Dazzle завершил запись файла. Затем все, что вы делаете, это проверяете наличие этого файла, чтобы знать, что он закончен.

1 голос
/ 25 февраля 2010

Возможно, это не очень хорошее решение, но вы можете попытаться переименовать файл несколько раз, подождите немного, если он не удастся.

...