pyinotify 是什么

pyinotify 是一个简单而有用的 Python 模块,它可用于在 Linux 中实时监控文件系统的更改。

它依赖于 inotify(在内核 2.6.13 中纳入的 Linux 内核功能),它是一个事件驱动的通知程序,其通知通过三个系统调用从内核空间导出到用户空间。
pyinotify 的目的是绑定这三个系统调用,并在其上提供了一个通用和抽象的方法来操作这些功能。

环境要求:

  1. Linux kernel 2.6.13 或更高。
  2. Python 2.4 或更高。

:::warning 注意:pyinotify 仅支持 Linux,其他系统可以用 watchdog(watchdog 是跨平台的)。 :::

安装 pyinotify:

  1. $ pip install pyinotify

命令行中使用

监视用户 tecmint 的家目录(/home/tecmint)下的改变:

  1. $ python -m pyinotify -v /home/tecmint

image.png :::info 注意:当在运行 pyinotify 时如果没有指定要监视的目录,**/tmp** 将作为默认目录。

常用参数:

  • -r:递归监听目录
  • -a:新创建的子目录自动纳入监听 :::

代码中使用

基本使用

监控指定目录的所有事件:

  1. import pyinotify
  2. wm = pyinotify.WatchManager()
  3. wm.add_watch('/tmp', pyinotify.ALL_EVENTS) # 监控 /tmp 目录所有事件
  4. notifier = pyinotify.Notifier(wm)
  5. notifier.loop()

监控某几个事件:

  1. import pyinotify
  2. wm = pyinotify.WatchManager()
  3. wm.add_watch('/tmp', pyinotify.IN_CREATE | pyinotify.IN_DELETE) # 监控 /tmp 目录下创建、删除文件的事件
  4. notifier = pyinotify.Notifier(wm)
  5. notifier.loop()

wm.add_watch() 的几个常用关键字参数:

  • rec:设为 True 相当于在命令行使用时加 -r 选项。
  • auto_add:设为 True 相当于在命令行使用时加 -a 选项。

inotify 提供的事件表

  1. IN_ACCESS # 文件被读取
  2. IN_MODIFY # 文件被修改
  3. IN_ATTRIB # 元数据被修改
  4. IN_CLOSE_WRITE # 打开且等待写入的文件或目录被关闭
  5. IN_CLOSE_NOWRITE # 只读方式打开文件或目录被关闭
  6. IN_OPEN # 文件或目录被打开
  7. IN_MOVED_FROM # 监控的目录中的条目被移出监控区域
  8. IN_MOVED_TO # 目录或文件被移入监控区域
  9. IN_CREATE # 在被监控目录中创建了子目录或文件
  10. IN_DELETE # 被监控目录中有子目录或文件被删除
  11. IN_CLOSE # 文件被关闭,等同于IN_CLOSE_WRITE
  12. IN_MOVED # 文件被移动,等同于IN_MOVED_FROM

自定义对事件的处理

  1. import pyinotify
  2. class EventHandler(pyinotify.ProcessEvent):
  3. def process_IN_CREATE(self, event): # IN_CREATE 事件的处理程序
  4. pass
  5. def process_IN_DELETE(self, event): # IN_DELETE 事件的处理程序
  6. pass
  7. wm = pyinotify.WatchManager()
  8. wm.add_watch('/tmp', pyinotify.IN_CREATE | pyinotify.IN_DELETE)
  9. event_handler = EventHandler()
  10. notifier = pyinotify.Notifier(wm, event_handler)
  11. notifier.loop()