簡單了解Python下用于監(jiān)視文件系統(tǒng)的pyinotify包
什么是inotify:
- Inotify是一個事件驅(qū)動的通知機制,Inotify 提供一個簡單的API,使用最小的文件描述符,并且允許細粒度監(jiān)控。與 inotify 的通信是通過系統(tǒng)調(diào)用實現(xiàn)??捎玫暮瘮?shù)如下所示:
- inotify_init 是用于創(chuàng)建一個inotify實例的系統(tǒng)調(diào)用,并返回一個指向該實例的文件描述符。
- inotify_init1 與inotify_init相似,并帶有附加標志。如果這些附加標志沒有指定,將采用與inotify_init相同的值。
- inotify_add_watch 增加對文件或者目錄的監(jiān)控,并指定需要監(jiān)控哪些事件。標志用于控制是否將事件添加到已有的監(jiān)控中,是否只有路徑代表一個目錄才進行監(jiān)控,是否要追蹤符號鏈接,是否進行一次性監(jiān)控,當(dāng)首次事件出現(xiàn)后就停止監(jiān)控。
- inotify_rm_watch 從監(jiān)控列表中移出監(jiān)控項目。
- read 讀取包含一個或者多個事件信息的緩存。
- close 關(guān)閉文件描述符,并且移除所有在該描述符上的所有監(jiān)控。當(dāng)關(guān)于某實例的所有文件描述符都關(guān)閉時,資源和下層對象都將釋放,以供內(nèi)核再次使用。
因此,典型的監(jiān)控程序需要進行如下操作:
- 使用 inotify_init 打開一個文件描述符
- 添加一個或者多個監(jiān)控
- 等待事件
- 處理事件,然后返回并等待更多事件
- 當(dāng)監(jiān)控不再活動時,或者接到某個信號之后,關(guān)閉文件描述符,清空,然后退出。
pyinotify包的安裝
git clone https://github.com/seb-m/pyinotify.git cd pyinotify/ python setup.py install
Inotify 可以監(jiān)視的文件系統(tǒng)事件包括:
IN_ACCESS,即文件被訪問
IN_MODIFY,文件被write
IN_ATTRIB,文件屬性被修改,如chmod、chown、touch等
IN_CLOSE_WRITE,可寫文件被close
IN_CLOSE_NOWRITE,不可寫文件被close
IN_OPEN,文件被open
IN_MOVED_FROM,文件被移走,如mv
IN_MOVED_TO,文件被移來,如mv、cp
IN_CREATE,創(chuàng)建新文件
IN_DELETE,文件被刪除,如rm
IN_DELETE_SELF,自刪除,即一個可執(zhí)行文件在執(zhí)行時刪除自己
IN_MOVE_SELF,自移動,即一個可執(zhí)行文件在執(zhí)行時移動自己
IN_UNMOUNT,宿主文件系統(tǒng)被umount
IN_CLOSE,文件被關(guān)閉,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,文件被移動,等同于(IN_MOVED_FROM | IN_MOVED_TO)
pyinotify使用例子
#!/usr/bin/env python # encoding:utf-8 import os from pyinotify import WatchManager, Notifier, \ ProcessEvent,IN_DELETE, IN_CREATE,IN_MODIFY class EventHandler(ProcessEvent): """事件處理""" def process_IN_CREATE(self, event): print "Create file: %s " % os.path.join(event.path,event.name) def process_IN_DELETE(self, event): print "Delete file: %s " % os.path.join(event.path,event.name) def process_IN_MODIFY(self, event): print "Modify file: %s " % os.path.join(event.path,event.name) def FSMonitor(path='.'): wm = WatchManager() mask = IN_DELETE | IN_CREATE |IN_MODIFY notifier = Notifier(wm, EventHandler()) wm.add_watch(path, mask,auto_add=True,rec=True) print 'now starting monitor %s'%(path) while True: try: notifier.process_events() if notifier.check_events(): notifier.read_events() except KeyboardInterrupt: notifier.stop() break if __name__ == "__main__": FSMonitor('/home/firefoxbug')
相關(guān)文章
python在CMD界面讀取excel所有數(shù)據(jù)的示例
這篇文章主要介紹了python在CMD界面讀取excel所有數(shù)據(jù),幫助大家更好的利用python辦公,感興趣的朋友可以了解下2020-09-09Python 使用指定的網(wǎng)卡發(fā)送HTTP請求的實例
今天小編就為大家分享一篇Python 使用指定的網(wǎng)卡發(fā)送HTTP請求的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python sklearn數(shù)據(jù)預(yù)處理之正則化詳解
數(shù)據(jù)的預(yù)處理是數(shù)據(jù)分析,或者機器學(xué)習(xí)訓(xùn)練前的重要步驟,這篇文章主要為大家詳細介紹了sklearn數(shù)據(jù)預(yù)處理中正則化的相關(guān)知識,需要的可以參考下2023-10-10python try...finally...的實現(xiàn)方法
這篇文章主要介紹了python try...finally...的實現(xiàn)方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11PyTorch 如何設(shè)置隨機數(shù)種子使結(jié)果可復(fù)現(xiàn)
這篇文章主要介紹了PyTorch 設(shè)置隨機數(shù)種子使結(jié)果可復(fù)現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05Python使用numpy模塊實現(xiàn)矩陣和列表的連接操作方法
今天小編就為大家分享一篇Python使用numpy模塊實現(xiàn)矩陣和列表的連接操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python實現(xiàn)Mysql全量數(shù)據(jù)同步的腳本分享
這篇文章主要為大家詳細介紹了基于Python如何實現(xiàn)Mysql全量數(shù)據(jù)同步的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06Python數(shù)字圖像處理代數(shù)之加減乘運算
這篇文章主要介紹了Python數(shù)字圖像處理代數(shù)運算,對其中的加、減、乘運算分別作了詳細的講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09