Linux
如何監控文件的打開和關閉?
我正在寫一個人工智慧個人助理。該軟體的一部分是監視器守護程序。一個監視使用者活動視窗的小程序。我正在使用 python(與 libwnck 和 psutils 一起獲取有關活動視窗的資訊)。我希望我的顯示器做的一件事是跟踪聽眾經常聽的音樂。
無論如何我可以“監視”文件的打開和關閉嗎?psutils.Process 有一個返回打開文件列表的函式,但我需要一些方法來通知它來檢查它。目前它僅在視窗切換或打開或關閉視窗時檢查程序數據。
inotify
您可以使用子系統 監控文件的打開/關閉。pyinotify
是該子系統的一個介面。請注意,如果您有很多事件要進行 inotify,則可以刪除一些事件,但它適用於大多數情況(尤其是使用者互動將驅動文件打開/關閉的情況)。
pyinotify 可通過 easy_install/pip 和https://github.com/seb-m/pyinotify/wiki獲得
MWE(基於http://www.saltycrane.com/blog/2010/04/monitoring-filesystem-python-and-pyinotify/):
#!/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()
這是相當低級的資訊——您可能會驚訝於您的程序使用這些低級打開/關閉事件的頻率。您始終可以過濾和合併事件(例如,假設在特定時間段內為同一文件接收到的事件對應於相同的訪問)。