¿Es posible hacer que las operaciones de búsqueda () en un retorno de tubería con nombre sean exitosas?

12

¿Hay alguna manera de hacerlo de modo que cuando los programas intenten realizar seek()operaciones en una tubería con nombre vuelva con éxito (pero actúe como si la tubería fuera un archivo vacío) en lugar de 'Búsqueda ilegal'?

Tengo cada último bit de registro en mi sistema almacenado en una base de datos SQLite, no tengo archivos en ningún lado. Sin embargo, hay algunos programas que tienen problemas con esto. Hay 2 casos específicos;

  • Un programa quiere escribir en un archivo de registro que syslog-ng ha creado como una tubería con nombre y está leyendo. El programa quiere realizar un seek()por alguna razón y luego falla.
  • Un programa (como denyhosts o fail2ban) quiere leer de un archivo de registro que syslog-ng ha creado como una canalización con nombre y en el que está escribiendo. El programa quiere realizar un seek()en él y falla.

Idealmente, me gustaría que estos se comporten como si la tubería con nombre fuera solo un archivo vacío. No puedo ver ninguna razón por la cual un programa que escribe un registro necesitaría realizar una búsqueda de todos modos, solo debe abrir el archivo para agregarlo y comenzar a escribir. Puedo ver por qué querría buscar una lectura de programa, para que pueda reanudar desde su última posición, y me gustaría que se comporte como si el archivo estuviera vacío (como si hubiera sido truncado).

Entonces, ¿hay alguna opción que se pueda establecer en canalizaciones con nombre para que se comporten de esta manera? Si no, ¿hay un modo que se puede configurar cuando syslog-ng abre la tubería para que se comporte de esta manera (estoy abierto a hacer cambios en el código)? ¿O estoy en un arroyo?

Patricio
fuente

Respuestas:

10

Se han propuesto tuberías buscables para el kernel de Linux, pero no conozco un parche que funcione para implementarlas.

Podría usar una LD_PRELOADbiblioteca ed que anule la lseekllamada en archivos específicos. No conozco ningún envoltorio comercial para este propósito. Shadowfs podría ayudar a escribir uno.

Gilles 'SO- deja de ser malvado'
fuente
1
Probaré la ruta LD_PRELOAD. No es la mejor solución, pero debería ser factible.
Patrick
Por cierto, ¿sería necesario tener una tubería buscable para que menos pueda seguir la tubería de la misma manera que puede seguir el archivo? Estoy preguntando en el contexto de Seguir una tubería con menos? pregunta (es posible que prefiera responder allí).
Piotr Dobrogost el
@PiotrDobrogost En el contexto del Fcomando en menos, sería suficiente con menos para actualizar la pantalla si no obtiene ningún resultado durante un segundo más o menos. Hacer que las tuberías se puedan buscar no ayudaría: la diferencia relevante es que Fva al final del archivo, luego espera a que los datos aparezcan más allá del final, pero para una tubería, el final del archivo solo llega cuando el escritor cierra el archivo.
Gilles 'SO- deja de ser malvado'
1

Si la aplicación está llamando a buscar, está rota o no está pensada para funcionar en tuberías. Si es lo primero, entonces necesita ser reparado. Si es lo último, entonces espera que la búsqueda realmente funcione, por lo que mentir y afirmar que funcionó cuando no lo hizo seguramente causará una operación incorrecta.

Además, si el archivo de registro se reemplaza por una tubería con nombre, solo un proceso podría leerlo a la vez. Debería ser un zócalo en su lugar.

psusi
fuente
2
No está destinado a trabajar en tuberías no significa que no pueda trabajar en tuberías. ¿Qué sucede si la aplicación simplemente realiza una SEEK_END para llegar al final del archivo? O tal vez está haciendo un SEEK_CUR para encontrar la ubicación actual. Ninguno de estos causaría problemas si mintiera al programa sobre los resultados de la búsqueda. El único lugar que se rompería es si la aplicación intentara regresar y sobrescribir los datos ya escritos, lo que no debería estar haciendo con los archivos de registro. Y sí, soy consciente de la limitación de un proceso por tubería. Esto no será un problema.
Patrick
1
Si todo lo que hace es buscar hasta el final para agregar, entonces solo debe abrir el archivo en modo de agregar, por lo que cae en la categoría rota. Las aplicaciones no intentan encontrar la ubicación actual a menos que necesiten poder buscar en otro lugar, y luego regresar a la ubicación actual, por lo que cae en la categoría "lo romperá al fallar silenciosamente". Es muy poco probable que un programa llame a buscar pero realmente no necesita que funcione (y si lo hace, cae en la categoría rota).
psusi
1
No es verdad. Muchas aplicaciones buscan el final del archivo en caso de que algún otro programa haya escrito en el archivo desde la última vez que lo hizo. De lo contrario, escribir dónde está actualmente podría bloquear los cambios del otro programa. Y si está leyendo el archivo, es posible que desee usar SEEK_CUR para obtener su ubicación actual para que cuando el programa se inicie nuevamente, pueda reanudar donde lo dejó.
Patrick
1
@Patrick, para el primero, si está agregando, debería volver a abrir el archivo en modo de agregar. En este caso, está hablando de lectura, en cuyo caso, no tiene sentido omitir nuevos datos que aún no ha leído (e ignorar silenciosamente la búsqueda rompería eso). En cuanto a lo último, si está tratando de usar el intento de buscar volver a la misma posición después de cerrar y volver a abrir el archivo que se romperá en una tubería si ignora silenciosamente la búsqueda, ya que cuando cierra la tubería, el servidor obtiene un SIGPIPE, que presumiblemente lo restablece para que el siguiente cliente que abra la tubería comience desde el principio.
psusi