fswatch
es un monitor de cambio de archivos que recibe notificaciones cuando se modifica el contenido de los archivos o directorios especificados. fswatch
implementa varios monitores:
stat (2)
). fswatch
debería compilarse y funcionar correctamente en cualquier sistema que incluya cualquiera de las API antes mencionadas.
fswatch
es una interfaz de libfswatch
, una biblioteca con enlace C y C++. Puede encontrar más información sobre libfswatch
aquí.
Las características principales fswatch
son:
Las limitaciones de fswatch
dependen en gran medida del monitor que se utilice:
El monitor FSEvents , disponible solo en macOS, no tiene limitaciones conocidas y se adapta muy bien a la cantidad de archivos observados.
El monitor de notificación de eventos de archivos , disponible en los kernels de Solaris y sus derivados, no tiene limitaciones conocidas.
El monitor kqueue , disponible en cualquier sistema *BSD que incluya kqueue, requiere que se abra un descriptor de archivo para cada archivo que se esté viendo. Como resultado, este monitor no escala correctamente con la cantidad de archivos que se observan y puede comenzar a comportarse mal tan pronto como el proceso fswatch
se quede sin descriptores de archivos. En este caso, fswatch
arroja un error estándar por cada archivo que no se puede abrir.
El monitor inotify , disponible en Linux desde el kernel 2.6.13, puede sufrir un desbordamiento de la cola si los eventos se generan más rápido de lo que se leen de la cola. En cualquier caso, se garantiza que la aplicación recibirá una notificación de desbordamiento que se puede manejar para recuperarse sin problemas. Actualmente, fswatch
genera una excepción si se produce un desbordamiento de la cola. Las versiones futuras manejarán el desbordamiento emitiendo las notificaciones adecuadas.
El monitor de Windows sólo puede establecer directorios de vigilancia, no archivos. Para observar un archivo, se debe observar su directorio principal para recibir eventos de cambio para todos los archivos secundarios del directorio, de forma recursiva en cualquier profundidad. Opcionalmente, los eventos de cambio se pueden filtrar para incluir solo cambios en el archivo deseado.
El monitor de encuestas , disponible en cualquier plataforma, solo depende de la CPU y la memoria disponibles para realizar su tarea. El rendimiento de este monitor se degrada linealmente con la cantidad de archivos que se miran.
Las recomendaciones de uso son las siguientes:
En macOS, utilice sólo el monitor FSEvents
(que es el comportamiento predeterminado).
En Solaris y sus derivados se utiliza el monitor de notificación de eventos de archivos .
En Linux, utilice el monitor inotify
(que es el comportamiento predeterminado).
Si el número de archivos a observar es suficientemente pequeño, utilice el monitor kqueue
. Tenga en cuenta que en algunos sistemas el número máximo de descriptores de archivos que un proceso puede abrir se establece en un valor muy bajo (valores tan bajos como 256 no son infrecuentes), incluso si el sistema operativo puede permitir un valor mucho mayor. En este caso, consulte la documentación de su sistema operativo para aumentar este límite, ya sea por proceso o para todo el sistema.
Si es posible, observe los directorios en lugar de los archivos. La elaboración adecuada del lado receptor de los eventos para tratar con directorios puede reducir sensiblemente el consumo de recursos del monitor.
En Windows, utilice el monitor windows
.
Si nada de lo anterior se aplica, utilice el monitor de encuestas. La experiencia de los autores indica que fswatch
requiere aproximadamente 150 MB de memoria RAM para observar una jerarquía de 500.000 archivos con una longitud de ruta mínima de 32 caracteres. Un cuello de botella común del monitor de encuesta es el acceso al disco, ya que stat()
- procesar una gran cantidad de archivos puede llevar una gran cantidad de tiempo. En este caso, la latencia debe establecerse en un valor suficientemente grande para reducir la degradación del rendimiento que puede resultar del acceso frecuente al disco.
Un usuario normal puede obtener fswatch
desde el administrador de paquetes de su sistema operativo o desde uno de terceros. Si buscas fswatch
para macOS, puedes instalarlo usando MacPorts o Homebrew:
# MacPorts
$ port install fswatch
# Homebrew
$ brew install fswatch
En FreeBSD, fswatch
se puede instalar usando pkg:
# pkg install fswatch-mon
Consulte su administrador de paquetes favorito y avísenos si falta fswatch
allí.
Un usuario que desee crear fswatch
debería obtener un tarball de lanzamiento. Un tarball de lanzamiento contiene todo lo que un usuario necesita para compilar fswatch
en su sistema, siguiendo las instrucciones detalladas en la sección Instalación a continuación y el archivo INSTALL
.
Un desarrollador que desee modificar fswatch
debe obtener las fuentes (ya sea desde un archivo tar o clonando el repositorio) y tener instalado el GNU Build System en su máquina. Lea README.gnu-build-system
para obtener más detalles sobre cómo iniciar fswatch
desde fuentes en su máquina.
No se recomienda obtener una copia del repositorio de fuentes a menos que sea un desarrollador, tenga el sistema de compilación GNU instalado en su máquina y sepa cómo iniciarlo en las fuentes.
Consulte el archivo INSTALL
para obtener información detallada sobre cómo configurar e instalar fswatch
. Dado que fswatch
crea y utiliza bibliotecas dinámicas, en algunas plataformas es posible que deba realizar tareas adicionales antes de poder usar fswatch
:
Asegúrese de que el directorio de instalación de bibliotecas dinámicas ( $PREFIX/lib
) esté incluido en las rutas de búsqueda del vinculador dinámico de su sistema operativo. La ruta predeterminada, /usr/local/lib
, funcionará en casi todos los sistemas operativos.
Es posible que sea necesario actualizar los enlaces y el caché de las bibliotecas dinámicas. En sistemas GNU/Linux es posible que necesites ejecutar ldconfig
:
$ ldconfig
fswatch
es un programa C++ y para compilarlo se requiere un compilador de C++ que cumpla con el estándar C++11. Consulte la documentación de su sistema operativo para obtener información sobre cómo instalar la cadena de herramientas de C++ y el tiempo de ejecución de C++.
No se requieren otros paquetes de software ni dependencias para configurar e instalar fswatch
excepto las API antes mencionadas utilizadas por los monitores del sistema de archivos.
fswatch
proporciona la siguiente documentación:
La documentación oficial fswatch
se proporciona en formato Texinfo. Esta es la fuente de información más completa sobre fswatch
y la única autorizada. La página de manual, en particular, es un código auxiliar que sugiere al usuario que utilice la página de información.
Si está instalando fswatch
utilizando un administrador de paquetes y desea incluir el manual en PDF en el paquete, envíe una solicitud de función al responsable del paquete.
fswatch
es localizable y utiliza internamente GNU gettext
para desacoplar las cadenas localizables de su traducción. Las configuraciones regionales disponibles actualmente son:
en
).it
).es
). Para crear fswatch
con soporte de localización, necesita tener instalado gettext
en su sistema. Si configure
no puede encontrar
o el vinculador no puede encontrar libintl
, es posible que deba proporcionar manualmente su ubicación para configure
, generalmente usando las variables CPPFLAGS
y LDFLAGS
. Consulte README.macos
para ver un ejemplo.
Si gettext
no está disponible en su sistema, fswatch
se compilará correctamente, pero carecerá de soporte de localización y la única configuración regional disponible será el inglés.
fswatch
acepta una lista de rutas para las cuales se deben recibir eventos de cambio:
$ fswatch [options] ... path-0 ... path-n
La secuencia de eventos se crea incluso si alguna de las rutas aún no existe. Si se crean después de iniciar fswatch
, los eventos de cambio se recibirán correctamente. Dependiendo del observador que se utilice, las rutas recién creadas se monitorearán una vez que haya transcurrido la cantidad de latencia configurada.
La salida de fswatch
se puede canalizar a otro programa para poder procesarla aún más:
$ fswatch -0 path | while read -d "" event
do
// do something with ${event}
done
Para ejecutar un comando cuando un conjunto de eventos de cambio se imprime en la salida estándar pero no se requieren detalles del evento, se puede usar el siguiente comando:
$ fswatch -o path | xargs -n1 -I{} program
El comportamiento es consistente con versiones anteriores de fswatch
(v. 0.x). Por favor, lea la sección Problemas de compatibilidad con fswatch v. 0.x para obtener más información.
Por defecto, fswatch
elige el mejor monitor disponible en la plataforma actual, en términos de rendimiento y consumo de recursos. Si el usuario desea especificar un monitor diferente, se puede utilizar la opción -m
para especificar el monitor por nombre:
$ fswatch -m kqueue_monitor path
La lista de monitores disponibles se puede obtener con la opción -h
.
Para obtener más información, consulte la documentación fswatch
.
Todos son bienvenidos a contribuir a fswatch
. Por favor, consulte CONTRIBUTING
para obtener más información.
Los informes de errores se pueden enviar directamente a los autores.
Se puede contactar al autor en IRC, utilizando el canal Freenode #fswatch
.
Este software tiene doble licencia GPL v. 3.0 y Apache License v. 2.0.
Copyright (c) 2013-2021 Enrico M. Crisóstomo
Este programa es software gratuito; puede redistribuirlo y/o modificarlo según los términos de la Licencia Pública General GNU publicada por la Free Software Foundation; ya sea la versión 3 o (a su elección) cualquier versión posterior.
Este programa se distribuye con la esperanza de que sea de utilidad, pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la Licencia pública general de GNU para obtener más detalles.
Debería haber recibido una copia de la Licencia Pública General GNU junto con este programa. Si no, consulte http://www.gnu.org/licenses/.