fswatch
é um monitor de alteração de arquivos que recebe notificações quando o conteúdo dos arquivos ou diretórios especificados é modificado. fswatch
implementa vários monitores:
stat (2)
possa ser usado). fswatch
deve ser compilado e funcionar corretamente em qualquer sistema que envie qualquer uma das APIs mencionadas acima.
fswatch
é uma interface de libfswatch
, uma biblioteca com ligação C e C++. Mais informações sobre libfswatch
podem ser encontradas aqui.
Os principais recursos fswatch
são:
As limitações do fswatch
dependem em grande parte do monitor usado:
O monitor FSEvents , disponível apenas no macOS, não tem limitações conhecidas e se adapta muito bem ao número de arquivos observados.
O monitor File Events Notification , disponível nos kernels Solaris e seus derivados, não tem limitações conhecidas.
O monitor kqueue , disponível em qualquer sistema *BSD com kqueue, requer que um descritor de arquivo seja aberto para cada arquivo sendo monitorado. Como resultado, esse monitor não se adapta bem ao número de arquivos observados e pode começar a se comportar mal assim que o processo fswatch
ficar sem descritores de arquivo. Nesse caso, fswatch
despeja um erro no erro padrão para cada arquivo que não pode ser aberto.
O monitor inotify , disponível no Linux desde o kernel 2.6.13, pode sofrer um estouro de fila se os eventos forem gerados mais rápido do que são lidos na fila. Em qualquer caso, é garantido que o aplicativo receba uma notificação de estouro que pode ser tratada para uma recuperação normal. Atualmente, fswatch
lança uma exceção se ocorrer um estouro de fila. Versões futuras lidarão com o excesso emitindo notificações adequadas.
O monitor do Windows só pode estabelecer diretórios de observação, não arquivos. Para monitorar um arquivo, seu diretório pai deve ser monitorado para receber eventos de mudança para todos os filhos do diretório, recursivamente em qualquer profundidade. Opcionalmente, os eventos de alteração podem ser filtrados para incluir apenas alterações no arquivo desejado.
O poll monitor, disponível em qualquer plataforma, depende apenas da CPU e memória disponíveis para realizar sua tarefa. O desempenho deste monitor diminui linearmente com o número de arquivos monitorados.
As recomendações de uso são as seguintes:
No macOS, use apenas o monitor FSEvents
(que é o comportamento padrão).
No Solaris e seus derivados, use o monitor Notificação de eventos de arquivo .
No Linux, use o monitor inotify
(que é o comportamento padrão).
Se o número de arquivos a serem observados for suficientemente pequeno, use o monitor kqueue
. Tenha em atenção que em alguns sistemas o número máximo de descritores de ficheiros que podem ser abertos por um processo está definido para um valor muito baixo (valores tão baixos como 256 não são invulgares), mesmo que o sistema operativo permita um valor muito maior. Nesse caso, verifique a documentação do sistema operacional para aumentar esse limite por processo ou em todo o sistema.
Se possível, observe os diretórios em vez dos arquivos. A elaboração adequada do lado receptor dos eventos para lidar com diretórios pode reduzir sensivelmente o consumo de recursos do monitor.
No Windows, use o monitor windows
.
Se nenhuma das opções acima se aplicar, use o monitor de votação. A experiência dos autores indica que fswatch
requer aproximadamente 150 MB de memória RAM para observar uma hierarquia de 500.000 arquivos com um comprimento mínimo de caminho de 32 caracteres. Um gargalo comum do monitor de pesquisa é o acesso ao disco, já que stat()
executar um grande número de arquivos pode levar muito tempo. Neste caso, a latência deve ser definida para um valor suficientemente grande para reduzir a degradação do desempenho que pode resultar do acesso frequente ao disco.
Um usuário comum pode conseguir obter fswatch
do gerenciador de pacotes do seu sistema operacional ou de terceiros. Se você estiver procurando pelo fswatch
para macOS, poderá instalá-lo usando MacPorts ou Homebrew:
# MacPorts
$ port install fswatch
# Homebrew
$ brew install fswatch
No FreeBSD, fswatch
pode ser instalado usando pkg:
# pkg install fswatch-mon
Verifique seu gerenciador de pacotes favorito e informe-nos se fswatch
estiver faltando nele.
Um usuário que deseja construir fswatch
deve obter um tarball de lançamento. Um tarball de lançamento contém tudo que um usuário precisa para construir fswatch
em seu sistema, seguindo as instruções detalhadas na seção Instalação abaixo e no arquivo INSTALL
.
Um desenvolvedor que deseja modificar fswatch
deve obter os fontes (seja de um tarball de origem ou clonando o repositório) e ter o GNU Build System instalado em sua máquina. Por favor, leia README.gnu-build-system
para obter mais detalhes sobre como inicializar fswatch
a partir de fontes em sua máquina.
Obter uma cópia do repositório de origem não é recomendado, a menos que você seja um desenvolvedor, tenha o GNU Build System instalado em sua máquina e saiba como inicializá-lo nos fontes.
Consulte o arquivo INSTALL
para obter informações detalhadas sobre como configurar e instalar fswatch
. Como o fswatch
cria e usa bibliotecas dinâmicas, em algumas plataformas pode ser necessário realizar tarefas adicionais antes de poder usar fswatch
:
Certifique-se de que o diretório de instalação das bibliotecas dinâmicas ( $PREFIX/lib
) esteja incluído nos caminhos de pesquisa do vinculador dinâmico do seu sistema operacional. O caminho padrão, /usr/local/lib
, funcionará em quase todos os sistemas operacionais.
Pode ser necessário atualizar os links e o cache das bibliotecas dinâmicas. Em sistemas GNU/Linux você pode precisar executar ldconfig
:
$ ldconfig
fswatch
é um programa C++ e é necessário um compilador C++ compatível com o padrão C++ 11 para compilá-lo. Verifique a documentação do sistema operacional para obter informações sobre como instalar a cadeia de ferramentas C++ e o tempo de execução C++.
Nenhum outro pacote de software ou dependência é necessário para configurar e instalar fswatch
exceto as APIs mencionadas acima usadas pelos monitores do sistema de arquivos.
fswatch
fornece a seguinte documentação:
A documentação oficial fswatch
é fornecida no formato Texinfo. Esta é a fonte de informações mais abrangente sobre fswatch
e a única confiável. A página man, em particular, é um esboço que sugere ao usuário usar a página de informações.
Se você estiver instalando fswatch
usando um gerenciador de pacotes e quiser que o manual em PDF seja incluído no pacote, envie uma solicitação de recurso ao mantenedor do pacote.
fswatch
é localizável e usa GNU gettext
internamente para desacoplar string localizável de sua tradução. As localidades atualmente disponíveis são:
en
).it
).es
). Para construir fswatch
com suporte de localização, você precisa ter gettext
instalado em seu sistema. Se configure
não puder encontrar
ou o vinculador não puder encontrar libintl
, talvez seja necessário fornecer manualmente sua localização para configure
, geralmente usando as variáveis CPPFLAGS
e LDFLAGS
. Veja README.macos
para ver um exemplo.
Se gettext
não estiver disponível em seu sistema, fswatch
será compilado corretamente, mas não terá suporte para localização e o único idioma disponível será o inglês.
fswatch
aceita uma lista de caminhos para os quais os eventos de mudança devem ser recebidos:
$ fswatch [options] ... path-0 ... path-n
O fluxo de eventos é criado mesmo que algum dos caminhos ainda não exista. Se eles forem criados após o lançamento fswatch
, os eventos de alteração serão recebidos corretamente. Dependendo do inspetor usado, os caminhos recém-criados serão monitorados depois que a quantidade de latência configurada tiver decorrido.
A saída do fswatch
pode ser canalizada para outro programa para processá-la posteriormente:
$ fswatch -0 path | while read -d "" event
do
// do something with ${event}
done
Para executar um comando quando um conjunto de eventos de alteração é impresso na saída padrão, mas nenhum detalhe do evento é necessário, o seguinte comando pode ser usado:
$ fswatch -o path | xargs -n1 -I{} program
O comportamento é consistente com versões anteriores do fswatch
(v. 0.x). Por favor, leia a seção Problemas de compatibilidade com fswatch v. 0.x para obter mais informações.
Por padrão, fswatch
escolhe o melhor monitor disponível na plataforma atual, em termos de desempenho e consumo de recursos. Se o usuário desejar especificar um monitor diferente, a opção -m
poderá ser usada para especificar o monitor por nome:
$ fswatch -m kqueue_monitor path
A lista de monitores disponíveis pode ser obtida com a opção -h
.
Para obter mais informações, consulte a documentação fswatch
.
Todos são bem-vindos para contribuir com fswatch
. Por favor, consulte CONTRIBUTING
para obter mais informações.
Relatórios de bugs podem ser enviados diretamente aos autores.
O autor pode ser contatado no IRC, usando o canal Freenode #fswatch
.
Este software possui licença dupla sob a GPL v. 3.0 e a Licença Apache v.
Copyright (c) 2013-2021 Enrico M. Crisóstomo
Este programa é um software livre; você pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation; versão 3 ou (opcional) qualquer versão posterior.
Este programa é distribuído na esperança de que seja útil, mas SEM QUALQUER GARANTIA; mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM. Veja a Licença Pública Geral GNU para mais detalhes.
Você deverá ter recebido uma cópia da Licença Pública Geral GNU junto com este programa. Caso contrário, consulte http://www.gnu.org/licenses/.