在上文 <浅析 Linux inotify机制> https://my.oschina.net/u/2291453/blog/833919 咱们已经探讨过Linux下的inotify机制, 也给出了简单实战例子, 但是c语言版本的, 无独有偶, python也封装这机制的库: pyinotify,那我们在简单实验下吧!
安装
依赖关系:
- Linux ≥ 2.6.13
- Python ≥ 2.4 (including Python 3.x)
1.通过pip安装
pip install pyinotify
2.通过 https://pypi.python.org/pypi/pyinotify 下载源码包, 源码安装
用法
pyinotify 支持的系统事件, 和 C语言版本的inotify相一致, 同样也是:
事件掩码 | 文件系统事件 |
---|---|
IN_ACCESS | 文件被访问 |
IN_MODIFY | 文件内容被修改 |
IN_ATTRIB | 文件属性被修改( 如 chmod ) |
IN_CLOSE_WRITE | 可写文件被关闭 |
IN_CLOSE_NOWRITE | 不可写文件被关闭 |
IN_MOVED_FROM | 文件被移走( 如 mv ) |
IN_MOVED_TO | 文件被移来( 如 mv, cp ) |
IN_OPEN | 文件被打开 |
IN_CREATE | 文件被创建 |
IN_DELETE | 文件被删除 |
IN_DELETE_SELF | 自删除( 一个可执行文件在执行时删除自己) |
IN_MOVE_SELF | 自移动( 一个可执行文件在执行时移动自己 ) |
IN_UNMOUNT | 宿主文件系统被卸载 |
IN_CLOSE | 文件被关闭等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) |
IN_MOVE | 文件被移动 等同于 (IN_MOVED_FROM | IN_MOVED_TO) |
#!/usr/bin/python27
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 fs_monitor(path='.'):
# 初始化watch管理器, 用于管理事件
wm = WatchManager()
mask = IN_DELETE | IN_CREATE | IN_MODIFY
# process_event 实例和 watch管理器关联, 返回通知查看对象
notifier = Notifier(wm, EventHandler())
# 将目标路径, 掩码添加到watch管理器
wm.add_watch(path, mask, rec=True)
print 'Now starting monitor: %s' % path
while 1:
try:
# 同步事件
notifier.process_events()
# 检查是否有可读事件, 否则一直堵塞
if notifier.check_events():
# 读取事件
notifier.read_events()
except KeyboardInterrupt:
notifier.stop
break
fs_monitor()
执行
py27 fs_monitor.py
输出:
[root@iZ23pynfq19Z ~]# py27 fs_monitor.py
Now starting monitor: .
Modify file ./.fs_monitor.py.swp
那么简单的一个pyinotify实例就已经写出来了, 我们可以利用这些来帮助我们干一些对实时性要求比较高的事情,例如: 类似 tail -f 监听文件~
欢迎各位大神指点, 转载请注明: https://my.oschina.net/u/2291453/blog/834335