Estoy desarrollando un software que utilizará inotify para realizar un seguimiento de los cambios en una gran cantidad de archivos (de decenas a cientos de miles de archivos). Se me han ocurrido estas ideas:
- un reloj por archivo
- una vigilancia por directorio principal
- evite inotify y escanee periódicamente el fs en busca de cambios (no recomendado)
Tendré una base de datos de todos los archivos que estoy viendo y alguna información estadística básica (como mtime y tamaño), sin embargo, tendría que registrar cada archivo en ese directorio hasta encontrar el que cambió.
¿Qué sería más rápido, toneladas (más de 100 000) de relojes inotify o toneladas de llamadas de emergencia?
Estoy pensando que sería mejor reducir la cantidad de llamadas de estadísticas, pero no sé lo suficiente sobre inotify.
Nota:
Esto se ejecutará en una estación de trabajo, no en un servidor. Su objetivo principal es sincronizar los cambios (potencialmente en un sistema de archivos completo) entre un cliente y un servidor remoto.
Respuesta aceptada:
Cuando read()
un inotify fd, el name
El campo de la estructura devuelta le indica qué archivo se modificó en relación con el directorio que se está viendo, por lo que no debería tener que registrar todos los archivos en un directorio después del evento.
Ver http://linux.die.net/man/7/inotify
Específicamente:
struct inotify_event { int wd; /* Watch descriptor */ uint32_t mask; /* Mask of events */ uint32_t cookie; /* Unique cookie associating related events (for rename(2)) */ uint32_t len; /* Size of 'name' field */ char name[]; /* Optional null-terminated name */ };
El campo de nombre solo está presente cuando se devuelve un evento para un archivo
dentro de un directorio observado; identifica la ruta del archivo relativa
al directorio observado. Este nombre de ruta termina en nulo y puede
incluir más bytes nulos para alinear las lecturas posteriores con un límite de dirección
adecuado.