Как мой демон Linux может знать, когда Windows-программа прекратила писать файл, к которому я получаю доступ через Samba?

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

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

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

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

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

5
задан Kit Peters 27 February 2010 в 14:02
поделиться

4 ответа

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

1
ответ дан 14 December 2019 в 04:36
поделиться

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

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

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

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

5
ответ дан 14 December 2019 в 04:36
поделиться

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

1
ответ дан 14 December 2019 в 04:36
поделиться

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

1
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: