Como monitorar a abertura e o fechamento de arquivos?

2

Estou escrevendo um assistente pessoal de IA. Uma parte do software é um daemon de monitor. Um pequeno processo que monitora as janelas ativas do usuário. Eu estou usando python (com libwnck e psutils para obter informações sobre janelas ativas). Uma coisa que gostaria que meu monitor fizesse é acompanhar as músicas que o ouvinte costuma ouvir.

Existe alguma maneira que eu possa 'monitorar' abrir e fechar arquivos? psutils.Process tem uma função que retorna uma lista de arquivos abertos, mas eu preciso de alguma forma para notificá-lo para verificar isso. Atualmente, ele apenas verifica os dados do processo quando as janelas são alternadas ou quando uma janela é aberta ou fechada.

    
por turtleDev 03.06.2015 / 15:41

1 resposta

4

Você pode monitorar a abertura / fechamento de arquivos usando o subsistema inotify . pyinotify é uma interface para este subsistema.

Note que se você tem muitos eventos para inutilizar, alguns podem ser descartados, mas funciona para a maioria dos casos (especialmente o caso em que a interação com o usuário conduzirá a abertura / fechamento de arquivos).

pyinotify está disponível via easy_install / pip e no link

MWE (com base no link ):

#!/usr/bin/env python
import pyinotify

class MyEventHandler(pyinotify.ProcessEvent):
    def process_IN_CLOSE_NOWRITE(self, event):
        print "File closed:", event.pathname

    def process_IN_OPEN(self, event):
        print "File opened::", event.pathname

def main():
    # Watch manager (stores watches, you can add multiple dirs)
    wm = pyinotify.WatchManager()
    # User's music is in /tmp/music, watch recursively
    wm.add_watch('/tmp/music', pyinotify.ALL_EVENTS, rec=True)

    # Previously defined event handler class
    eh = MyEventHandler()

    # Register the event handler with the notifier and listen for events
    notifier = pyinotify.Notifier(wm, eh)
    notifier.loop()

if __name__ == '__main__':
    main()

Esta é uma informação de nível muito baixo - você pode se surpreender com a frequência com que seu programa usa esses eventos de abertura / fechamento de baixo nível. Você sempre pode filtrar e unir eventos (por exemplo, suponha que os eventos recebidos pelo mesmo arquivo em um determinado período correspondam ao mesmo acesso).

    
por 03.06.2015 / 18:01