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.
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
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. –