Descobre quantas vezes um arquivo foi aberto?

5

Ok, aqui está um quebra-cabeça: como posso descobrir quantas vezes um arquivo em particular foi aberto (em qualquer modo) por algum / todos os processos atualmente em execução em uma máquina Linux? Ou seja quantos descritores de arquivos, globalmente (ou dentro de um namespace / container, não importam) estão em uso referenciando um determinado arquivo / inode?

Uma maneira de descobrir isso provavelmente seria usar o lsof e contar quantas vezes o nome do arquivo em questão aparece em sua saída. Mas isso parece deselegante, e em qualquer caso, eu precisaria de algo assim programaticamente, em C.

Editar : ou talvez uma pergunta semelhante, mas diferente, que também seria útil: é um arquivo específico (um arquivo aleatório no sistema de arquivos, portanto, não é necessário anexar manipuladores e esperar que algo aconteça) aberto, por qualquer processo (possivelmente excluindo este)?

    
por Ivan Voras 17.04.2017 / 16:40

2 respostas

3

Para os arquivos atualmente abertos, se estiver no Linux, você precisará stat() de todos os arquivos /proc/*/fd/* e comparar números de inode; e leia todo o /proc/*/maps (e também compare os números de inode).

Verifique os sinalizadores em /proc/*/fdinfo/* (precisa de uma versão relativamente recente do Linux) e a segunda coluna em /proc/*/maps para saber se o arquivo está aberto no modo de leitura ou gravação (ou ambos, ou com o acréscimo ...).

    
por 18.04.2017 / 18:18
2

Acho que você deseja anexar um manipulador de eventos do sistema de arquivos ao arquivo, inotify é o caminho a percorrer. Há uma ferramenta de linha de comando, bem como um api C. Eu não sou especialista em usá-lo, eu apenas mucked com a ferramenta de linha de comando por alguns minutos, então eu não vou tentar fornecer exemplos de código, mas você pode encontrar muita informação sobre as pesquisas do Google.

link

link

Ele fornecerá notificações para (da página man acima):

IN_ACCESS
File was accessed (read) (*).

IN_ATTRIB
Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).

IN_CLOSE_WRITE
File opened for writing was closed (*).

IN_CLOSE_NOWRITE
File not opened for writing was closed (*).

IN_CREATE
File/directory created in watched directory (*).

IN_DELETE
File/directory deleted from watched directory (*).

IN_DELETE_SELF
Watched file/directory was itself deleted.

IN_MODIFY
File was modified (*).

IN_MOVE_SELF
Watched file/directory was itself moved.

IN_MOVED_FROM
File moved out of watched directory (*).

IN_MOVED_TO
File moved into watched directory (*).

IN_OPEN
File was opened (*).
    
por 17.04.2017 / 20:52