Inotify può essere utilizzato per cercare un file specifico da creare senza monitorare l'intera directory?


9

Voglio essere avvisato quando viene creato un nome file specifico. Sto guardando inotify. Il IN_CREATEflag è disponibile per il monitoraggio di una directory per eventuali modifiche al suo interno, ma preferirei non monitorare l'intera directory poiché potrebbe esserci una buona quantità di attività in quella directory oltre al file che mi interessa. ?


3
Immagino che la risposta sia "no". Almeno non con inotify. Se riesci a controllare la posizione del file, è meglio creare una directory speciale solo per esso, in modo da poter monitorare la directory senza essere svegliato dalle distrazioni. Se non è possibile controllare la posizione, sei di fronte a uno confrontando il campo restituito 'nome' contro la (relativa) nome del file, oppure chiamando qualcosa di simile accesscon F_OKper vedere se esiste ancora.
BobDoolittle,

Risposte:


7

Non puoi avere il kernel solo per informarti di una modifica a un certo percorso. Le ragioni sono un po 'sottili:

  • In Linux, un oggetto file esiste indipendentemente dai nomi che può avere. I nomi dei file sono in realtà attributi della loro directory di contenimento e un singolo file può essere chiamato da più nomi (vedi, hardlinking).

  • Il kernel deve avere qualcosa a cui allegare oggetti inotify; non può associare un oggetto a un nome percorso poiché un nome percorso non è un vero oggetto file system; devi allegare alla directory principale o al file che il percorso descrive. Ma non puoi allegare al file, perché stai guardando per vedere se viene creato un file con un determinato nome, non le modifiche a un determinato file.

In teoria, il kernel potrebbe implementare un'API che consente di selezionare eventi per un determinato nome percorso quando si aggiunge un watch a una directory, allo stesso modo in cui consente di selezionare i tipi di eventi. Ciò gonfierebbe l'API e alla fine il kernel elaborerà gli stessi dati e farebbe lo stesso confronto di stringhe che faresti nello spazio utente.

C'è un notevole successo prestazionale nel mettere un orologio in una directory molto attiva? Non sono sicuro di quanto tu voglia dire attivo; decine di file al secondo, centinaia, milioni?

In ogni caso, accesseviterei: sarà sempre agitato. Un file potrebbe essere creato e rimosso tra le chiamate a access, e la chiamata accessin un ciclo molto stretto sarà lenta, ed è il tipo di problema che è inotifystato progettato per risolvere.


Se non posso essere informato di "una modifica a un determinato percorso", come funziona inotify? Ti riferisci forse a percorsi di file specifici ma non a percorsi di directory?
BobDoolittle,

Inoltre, il vantaggio di fare il controllo nel kernel piuttosto che nello spazio utente è se ci sono più processi che monitorano la directory. Invece di contestualizzarli tutti inutilmente e di farli fare tutti un confronto, potresti semplicemente passare al processo che si preoccupa effettivamente del percorso del file in questione.
BobDoolittle,

Intendevo dire che quando si controlla una directory (che ovviamente è data da un percorso), non si può dire al kernel di selezionare solo eventi con un determinato nome (quindi sì, mi riferisco ai percorsi 'file'). Comprendo i vantaggi teorici del non svegliare un sacco di processi, ma devo chiedere nuovamente se hai provato a utilizzare inotifye se le prestazioni sono state un vero problema.
Dylan Frese,

1
In alternativa, se molti processi sono interessati a determinati eventi, è possibile avere un processo che controlla i nomi dei file e invia eventi "interessanti" su qualcosa come un socket UNIX ai processi effettivamente interessati a questi eventi (come una sorta di servizio).
Dylan Frese,

I problemi di prestazioni possono essere estremamente difficili da misurare e diagnosticare. Piuttosto che camminare tra i muri di mattoni, preferisco adottare le buone pratiche di programmazione in primo luogo, sviluppare software che utilizza buoni schemi di progettazione ed evitare tali situazioni. Quindi no, non ho riscontrato alcun problema. Ho anticipato un potenziale problema e in questo caso ho evitato l'uso di inotify a causa di potenziali problemi lungo la strada. Come sviluppatore di software di sistema, credo di fornire solidi meccanismi per aiutare le persone a evitare problemi di prestazioni, che è lo scopo di inotificare.
BobDoolittle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.