Python文件系统监控

来自CloudWiki
跳转至: 导航搜索

实训背景

运维工作离不开文件系统的监控,如某个目录被删除,或者某个文件被修改、移动、删除时需要执行一定的操作或发出报警。当然,读者可能会想到使用循环检查文件或目录的信息来满足上述需求,也不是不可以,但这不是一个最好的方案,一是因为循环操作会不停地执行指令太耗CPU,二是不够实时,循环操作中会放一些等待指令,如time.sleep(3)来减少CPU的消耗,这就会导致监控的时机有一定的滞后,不够实时。本节介绍一个第三方库watchdog来实现文件系统监控,其原理是通过操作系统的事件触发的,不需要循环,也不需要等待。

watchdog介绍

watchdog用来监控指定目录/文件的变化,如添加删除文件或目录、修改文件内容、重命名文件或目录等,每种变化都会产生一个事件,且有一个特定的事件类与之对应,然后通过事件处理类来处理对应的事件

watchdog安装

pip3 install watchdog

运行实例

from watchdog.observers import Observer
from watchdog.events import *
import time


class FileEventHandler(FileSystemEventHandler):

    def __init__(self):
        FileSystemEventHandler.__init__(self)

    def on_moved(self, event):
        super(FileEventHandler, self).on_moved(event)
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        if event.is_directory:
            print(f"{ now } 文件夹由 { event.src_path } 移动至 { event.dest_path }")
        else:
            print(f"{ now } 文件由 { event.src_path } 移动至 { event.dest_path }")

    def on_created(self, event):
        super(FileEventHandler, self).on_created(event)
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        if event.is_directory:
            print(f"{ now } 文件夹 { event.src_path } 创建")
        else:
            print(f"{ now } 文件 { event.src_path } 创建")

    def on_deleted(self, event):
        super(FileEventHandler, self).on_deleted(event)
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        if event.is_directory:
            print(f"{ now } 文件夹 { event.src_path } 删除")
        else:
            print(f"{ now } 文件 { event.src_path } 删除")

    def on_modified(self, event):
        super(FileEventHandler, self).on_modified(event)
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        if event.is_directory:
            print(f"{ now } 文件夹 { event.src_path } 修改")
        else:
            print(f"{ now } 文件 { event.src_path } 修改")


if __name__ == "__main__":
    observer = Observer()
    path = r"d:\tttt"
    event_handler = FileEventHandler()
    observer.schedule(event_handler, path, True)
    print(f"监控目录 {path}")
    observer.start()
    observer.join()

输出:

监控目录 d:\tttt
2020-01-17 09:28:55 文件 d:\tttt\新建文本文档.txt 创建
2020-01-17 09:29:11 文件 d:\tttt\新建文本文档.txt 修改
2020-01-17 09:29:34 文件 d:\tttt\新建文本文档.txt 删除


运维场景中以下场合非常适合使用watchdog:

1)监控文件系统中文件或目录的增、删、改情况
(2)当特定的文件被创建、删除、修改、移动时执行相应的任务

思考:如何用watchdog模块来做一个安全保卫软件,如果系统文件被改变时,报警

改进方案

参考文档:https://www.cnblogs.com/xiehy/p/11413502.html