2010-02-25 23 views
5

Opracowuję system, który współpracuje z pakietem wysyłkowym USPS o nazwie Dazzle. Część tego systemu obejmuje demona monitorowania, którego celem jest pobieranie plików wartości rozdzielanych na tabulatory, przekształcanie ich w pliki XML rozpoznawane przez Dazzle i przekazywanie ich do programu Dazzle w celu generowania etykiet. A ta część działa dobrze. Chciałbym jednak również przeanalizować plik wyjściowy wygenerowany przez Dazzle i zaimportować go do bazy danych.W jaki sposób mój demon Linux może wiedzieć, kiedy program Windows przestał pisać plik, do którego uzyskuję dostęp przez SAMBA?

Należy zauważyć, że Dazzle działa w systemie Windows. Mój demon monitorowania jest napisany w Perlu i działa na systemie Linux. Mój system Linux ma katalogi wejściowe i wyjściowe Dazzle montowane za pośrednictwem Samby.

Istnieje mierzalne opóźnienie między momentem rozpoczęcia zapisywania pliku wyjściowego przez Dazzle i czasu jego zakończenia. Chciałbym wiedzieć, jak mogę poczekać, aż Dazzle zakończy zapisywanie pliku wyjściowego? Próbowałem otworzyć plik i zrobić na nim flock($fh, LOCK_SH), ale nie przyniosło to żadnego pożytku.

EDIT: Mam pomysł oparty na komentarzu "mobrule" poniżej. Dazzle zapisuje plik wyjściowy w formacie XML. Każda paczka w przesyłce jest zamknięta w tagach, a cały dokument jest zawarty w tagu. Tak więc, jeśli rozpocznę czytanie pliku przed jego ukończeniem, mogę po prostu poczekać na odpowiedni znacznik zamykający, zanim podejmiemy działanie.

Powinienem też wspomnieć o tym, co obecnie robię. Po wykryciu, że wyjściowy plik XML został utworzony, próbuję go parsować. Jeśli to przetwarzanie nie powiedzie się, śpię i spróbuję ponownie. Jeśli to zawiedzie, śpię dwa razy dłużej, a potem spróbuj ponownie i tak dalej. To zadziałało całkiem dobrze w testowaniu z 64-sekundowym limitem czasu.

Odpowiedz

1

To prawdopodobnie nie jest świetne rozwiązanie, ale można spróbować zmienić nazwę pliku wielokrotnie, przespać się na chwilę, jeśli zawiedzie.

1

Możesz spróbować wykonać blokadę w/LOCK_EX - a jeśli blokada się nie powiedzie, oznacza to, że wciąż jest zapisywana. Zakręć się tak, aż uzyskasz zamek, a olśnienie powinno zostać zrobione. To może się nie powieść, jeśli Dazzle kiedykolwiek zamknie plik i otworzy go ponownie w trybie/append, więc nie jest to najlepsze rozwiązanie.

+0

Dotyczy to tylko sytuacji, gdy funkcja olśnienia blokuje plik za pomocą tego samego mechanizmu blokującego. Jest to mało prawdopodobne i szczególnie mało prawdopodobne, jeśli Dazzle nie jest skryptem Perla. – mob

+0

To dobra uwaga - Dazzle jest aplikacją Windows i nie jest napisany w Perlu. Ponieważ blokady plików w Perlu są tylko "doradcze", to nie zadziała. Szkoda, bo w przeciwnym razie to najlepsze rozwiązanie, jakie słyszałem. –

1

Być może możesz mieć napisać Dazzle plik obojętny lub flagowy (może on zawierać wszystko, co chcesz, takie jak data/sygnatura czasowa lub numer kolejny), aby wskazać, że Dazzle zakończył zapisywanie pliku. Następnie wystarczy przetestować obecność tego pliku, aby dowiedzieć się, że jest on skończony.

5

Nie ma ogólnego i przenośnego sposobu na stwierdzenie, czy jakiś proces ma otwarty uchwyt pliku do jakiegoś dowolnego pliku. Musisz dokonać oceny, biorąc pod uwagę lokalną wiedzę na temat sytuacji.

W takim przypadku możliwe jest wysłanie zapytania do tabeli procesu na komputerze z systemem Windows, aby sprawdzić, czy program "Oślepienie" nadal działa. A może twoje doświadczenie daje ci inne wskazówki, takie jak "Oszołomienie nigdy nie trwa dłużej niż 20 sekund, aby uruchomić, gdy dane wejściowe są rozsądne" lub "gdy działa Dazzle, aktualizuje plik co kilka sekund .Jeżeli plik nie został zaktualizowany w, powiedzmy, 10 sekund, to istnieje bardzo duża szansa, że ​​Dazzle się skończy. "

Ale nie musisz czekać, aż Dazzle się zakończy. Całkiem dobrze jest przeczytać plik w tym samym czasie, w którym pisze do niego Dazzle - patrz the perldoc for the seek function, zwracając uwagę na część dotyczącą "jak naśladować tail -f". Następnie możesz zaktualizować bazę danych, gdy działa Dazzle.

W ten sposób, jeśli jesteś zbyt konserwatywny w zgadywaniu, kiedy Dazzle skończy, twoja baza danych będzie nadal aktualizowana w odpowiednim czasie, a jedynym kosztem będzie kilka bezużytecznych połączeń wyszukiwania i odczytu na uchwycie pliku w EOF.

+0

Cóż, nie mogę zaktualizować bazy danych podczas działania Dazzle, ponieważ aktualizuję bazę danych z wyników analizy danych wyjściowych Dazzle XML. Chociaż może uda mi się znaleźć parser lub napisać swój własny trywialny analizator składni, który nie wymaga kompletnego dokumentu do rozpoczęcia analizy. –