2010-02-25 5 views
5

Estoy desarrollando un sistema que se conecta con un paquete de envío de USPS llamado Dazzle. Parte de este sistema incluye un daemon de monitoreo cuyo objetivo es tomar los archivos de valores separados por tabulaciones, convertirlos en XML que reconoce Dazzle, y pasarlos a Dazzle para la generación de etiquetas. Y esta parte funciona bien. Lo que también quiero hacer, sin embargo, es analizar el archivo de salida que Dazzle genera e importarlo en una base de datos.¿Cómo puede saber mi daemon Linux cuando un programa de Windows ha dejado de escribir un archivo al que accedo a través de SAMBA?

Tenga en cuenta que Dazzle se ejecuta en Windows. Mi daemon de monitoreo está escrito en Perl y se ejecuta en Linux. Mi sistema Linux tiene los directorios de entrada y salida de Dazzle montados a través de Samba.

Existe un retraso medible entre el momento en que Dazzle comienza a escribir el archivo de salida y la hora en que finaliza. Lo que quiero saber es cómo puedo esperar a que Dazzle termine de escribir el archivo de salida. Intenté abrir el archivo y hacer flock($fh, LOCK_SH) en él, pero eso no parecía servir para nada.

EDIT: Tengo una idea basada en el comentario de "mobrule" a continuación. Dazzle escribe un archivo de salida en XML. Cada paquete en el envío está encerrado en etiquetas, y el documento completo está encerrado en una etiqueta. Entonces, si empiezo a leer el archivo antes de que esté completo, simplemente puedo esperar la etiqueta de cierre apropiada antes de tomar medidas.

Además, debería mencionar lo que estoy haciendo actualmente. Cuando detecto que el archivo XML de salida ha sido creado, intento analizarlo. Si ese análisis fracasa, duermo y vuelvo a intentarlo. Si eso falla, duermo el doble de tiempo, luego vuelvo a intentarlo, y así sucesivamente. Esto ha funcionado bastante bien en las pruebas con un tiempo de espera de 64 segundos.

Respuesta

1

Probablemente esta no sea una gran solución, pero podría tratar de cambiar el nombre del archivo repetidamente, dormir un poco si falla.

1

Puede intentar hacer un bloqueo w/LOCK_EX - y si el bloqueo falla, eso significa que todavía se está escribiendo. Gira así hasta que consigas el bloqueo, y deslumbrarte. Esto no funcionaría si Dazzle cierra el archivo y lo vuelve a abrir con el modo de adición, por lo que no es la mejor solución.

+0

Esto solo es válido si Dazzle también bloquea el archivo con el mismo mecanismo de bloqueo. Esto no es probable y especialmente improbable si Dazzle no es un script de Perl. – mob

+0

ese es un buen punto: Dazzle es una aplicación de Windows y no está escrita en Perl. Entonces, dado que los bloqueos de archivos en Perl son solo "de asesoramiento", eso no funcionará. Lástima, porque de lo contrario esa es la mejor solución que he escuchado. –

1

Tal vez puede hacer que Dazzle escriba un archivo ficticio o de bandera (puede contener cualquier cosa que desee como un sello de fecha/hora o número de secuencia) para indicar que Dazzle ha terminado de escribir el archivo. Entonces, todo lo que haces es probar la presencia de este archivo para saber que está terminado.

5

No hay una manera general y portátil de saber si algún proceso tiene una manejador de archivos abierto a algún archivo arbitrario. Debe hacer un juicio con su conocimiento local de la situación.

En este caso, es posible consultar la tabla de proceso en la máquina Windows para ver si el programa "Dazzle" aún se está ejecutando. O tal vez su experiencia le da otras pautas, como "Dazzle nunca lleva más de 20 segundos para ejecutarse cuando la entrada es razonable" o "cuando Dazzle se está ejecutando, actualiza un archivo cada dos segundos. Si el archivo no se ha actualizado en, por ejemplo, 10 segundos, hay muchas posibilidades de que Dazzle haya terminado ".

Pero no necesariamente tiene que esperar hasta que Dazzle haya terminado. Está perfectamente bien leer el archivo al mismo tiempo que Dazzle está escribiendo en él - ver the perldoc for the seek function, prestando atención a la parte sobre "cómo emular tail -f". Luego puede actualizar su base de datos mientras Dazzle se está ejecutando.

De esta forma, si es demasiado cauteloso para adivinar cuándo ha finalizado Dazzle, su base de datos se actualizará de manera oportuna, y el único costo serán unas inútiles llamadas de búsqueda y lectura en un identificador de archivo en EOF.

+0

Bueno, en realidad no puedo actualizar mi base de datos mientras Dazzle se está ejecutando, ya que estoy actualizando mi base de datos a partir de los resultados del análisis de la salida XML de Dazzle. Aunque tal vez podría encontrar un analizador sintáctico o escribir mi propio analizador trivial, eso no requiere que el documento esté completo para comenzar a analizar. –

Cuestiones relacionadas