Descubra quantas vezes um arquivo foi aberto?

Descubra quantas vezes um arquivo foi aberto?

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

Uma maneira de descobrir isso provavelmente seria usar lsof e contar quantas vezes o nome do arquivo em questão aparece em sua saída. Mas isso parece deselegante e, de qualquer forma, 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, sem anexar manipuladores e esperar que algo aconteça) foi aberto, por qualquer processo (possivelmente excluindo este um)?

Responder1

Para os arquivos atualmente abertos, se estiver no Linux, você terá que comparar stat()todos os /proc/*/fd/*arquivos e comparar os números dos inodes; e leia todos /proc/*/maps(e também compare os números dos inodes).

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

Responder2

Acho que você deseja anexar um manipulador de eventos do sistema de arquivos ao arquivo, inotifyé o caminho a seguir. Há uma ferramenta de linha de comando, bem como uma API C. Não sou especialista em usá-lo, só mexi na ferramenta de linha de comando por alguns minutos, então não tentarei fornecer exemplos de código, mas você pode encontrar muitas informações nas pesquisas do Google.

https://www.ibm.com/developerworks/library/l-inotify/

https://linux.die.net/man/7/inotify

Ele fornecerá notificações para (na página de manual 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 (*).

informação relacionada