Pregunta

Estoy escribiendo un observador de inotify en C para un servidor de Minecraft.Básicamente, observa server.log, obtiene la última línea, la analiza y, si coincide con una expresión regular;realiza algunas acciones.

El programa funciona bien normalmente a través de "cadena de eco que coincide con la expresión regular >> server.log", analiza y hace lo que debería.Sin embargo, cuando la cadena se escribe en el archivo automáticamente a través del servidor de Minecraft, no funciona hasta que apago el servidor o (a veces) cierro la sesión.

Publicaría el código, pero me pregunto si no tiene algo que ver con el vaciado de datos de ext4 al disco o algo por el estilo;un problema del sistema de archivos.Sin embargo, sería extraño si ese fuera el caso, porque "tail -f server.log" se actualiza cada vez que lo hace el archivo.

¿Fue útil?

Solución

Resolví mi propio problema.Resultó que el servidor estaba escribiendo en el archivo de registro más rápido de lo que el observador podía leer;por lo que el observador no estaba sincronizado.

Lo arreglé agregando un cheque después de que procesa el evento que dice "si el número de líneas actualmente en el archivo de registro es mayor que la longitud registrada del registro, vuelva a procesar el archivo hasta que los dos sean iguales".

¡Gracias por tu ayuda!

Otros consejos

Presumiblemente eso se debe a que estás atento a IN_CLOSE eventos, que pueden no ocurrir hasta que el servidor se apague (y cierre el identificador del archivo de registro).Ver hombre inotify(7) para parámetros de máscara válidos para el inotify_add_watch() llamar.Espero que quieras usar IN_WRITE.

Es muy probable que su teoría sea correcta, el sistema operativo está almacenando el archivo de registro en el búfer y el escritor de registros no tiene que vaciar ese búfer, por lo que todo permanecerá en el búfer hasta que el archivo se cierre o el búfer esté lleno.Una forma rápida de realizar la prueba es iniciar el registro hasta el punto en el que sepa que habría escrito eventos en el registro, luego cerrarlo a la fuerza para que no pueda cerrar el identificador, si el registro está vacío es definitivamente el búfer.Si puede conseguir el descriptor / identificador del archivo, puede usar setbuf para eliminar el almacenamiento en búfer, a costa del rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top