O inotify pode ser usado para observar a criação de um arquivo específico sem monitorar o diretório inteiro?

9

Quero ser notificado quando um nome de arquivo específico for criado. Eu estou olhando inotify. O IN_CREATEsinalizador está disponível para monitorar um diretório em busca de alterações, mas eu preferiria não monitorar o diretório inteiro, pois pode haver uma boa atividade nesse diretório além do arquivo no qual estou interessado. Isso pode ser feito ?

BobDoolittle
fonte
3
Eu estou supondo que a resposta é 'não'. Pelo menos não com inotify. Se você pode controlar o local do arquivo, é melhor criar um diretório especial apenas para ele, para que você possa monitorar o diretório sem ser despertado por distrações. Se você não pode controlar o local, pode comparar o campo 'name' retornado com o nome (relativo) do seu arquivo ou então chamar algo parecido accesscom F_OKpara ver se ele já existe.
precisa saber é o seguinte

Respostas:

7

Você não pode ter o kernel apenas informando sobre uma alteração em um determinado caminho. Os motivos são um pouco sutis:

  • No Linux, um objeto de arquivo existe independentemente de qualquer nome (s) que possa ter. Os nomes dos arquivos são, na verdade, atributos do diretório que os contém, e um único arquivo pode ser chamado por vários nomes (consulte, links diretos).

  • O kernel precisa ter algo para anexar inotificar objetos; ele não pode anexar um objeto a um nome de caminho, pois um nome de caminho não é um objeto real do sistema de arquivos; você precisa anexar ao diretório pai ou ao arquivo que o caminho descreve. Mas você não pode anexar ao arquivo, porque está assistindo para ver se um arquivo com um determinado nome é criado, não muda para um determinado arquivo.

Teoricamente, o kernel pode implementar uma API que permite selecionar eventos para um determinado nome de caminho ao adicionar um monitor a um diretório, da mesma maneira que permite selecionar tipos de eventos. Isso iria inchar a API e, no final, o kernel processaria os mesmos dados e faria a mesma comparação de strings que você faria no espaço do usuário.

Existe um desempenho perceptível ao colocar um relógio em um diretório muito ativo? Não tenho certeza de quão ativo você está falando; dezenas de arquivos por segundo, centenas, milhões?

De qualquer forma, eu evitaria access: sempre será uma corrida. Um arquivo pode ser criado e removido entre as chamadas para access, e a chamada accessem um loop muito apertado será lenta e é o tipo de problema que inotifyfoi projetado para resolver.

Dylan Frese
fonte
Se eu não posso ser informado sobre "uma alteração em um determinado caminho", como a inotificação funciona? Você talvez esteja se referindo especificamente aos caminhos de arquivos, mas não aos diretórios?
precisa saber é o seguinte
Além disso, a vantagem de fazer a verificação no kernel, e não no espaço do usuário, é se houver vários processos monitorando o diretório. Em vez de alternar entre contexto desnecessariamente e fazer com que todos façam uma comparação, basta alternar no processo que realmente se importa com o caminho do arquivo em questão.
precisa saber é o seguinte
Eu quis dizer que ao monitorar um diretório (que obviamente é fornecido por um caminho), você não pode dizer ao kernel para selecionar apenas eventos com um determinado nome (então sim, estou me referindo aos caminhos de 'arquivo'). Entendo os benefícios teóricos de não acordar muitos processos, mas tenho que perguntar novamente se você tentou usar inotifye se o desempenho foi um problema real.
Dylan Frese
1
Como alternativa, se muitos processos estiverem interessados ​​em determinados eventos, você poderá ter um processo observando nomes de arquivos e enviando eventos 'interessantes' sobre algo como um soquete UNIX para os processos realmente interessados ​​nesses eventos (como uma espécie de serviço).
Dylan Frese
Os problemas de desempenho podem ser extremamente difíceis de medir e diagnosticar. Em vez de entrar nas paredes de tijolos, prefiro adotar boas práticas de programação, desenvolver software que use bons padrões de design e evitar tais situações. Então não, eu não observei um problema. Antecipei um problema em potencial e evitei o uso de inotify nesse caso devido ao potencial de problemas no caminho. Como desenvolvedor de software de sistema, acredito em fornecer mecanismos robustos para ajudar as pessoas a evitar problemas de desempenho, que é o objetivo da inotificação.
precisa saber é o seguinte