zoukankan      html  css  js  c++  java
  • watchdog监控文件变更小脚本

    代码一:

    #!/usr/bin/python
    # -*- coding:UTF-8 -*-
    
    import time
    from watchdog.observers import Observer
    from watchdog.events import RegexMatchingEventHandler
    
    class MyHandler(RegexMatchingEventHandler):
    
        def __init__(self, regex_list=[r".*"]):
            super(MyHandler, self).__init__(regex_list)
    
        def on_created(self, event):
            if event.is_directory:
                pass
            else:
                print(event.event_type, event.src_path)
    
        def on_deleted(self, event):
            if event.is_directory:
                pass
            else:
                print(event.event_type, event.src_path)
    
        def on_modified(self, event):
            if event.is_directory:
                pass
            else:
                print(event.event_type, event.src_path)
    
        def on_moved(self, event):
            print("move", event.src_path, event.dest_path)
    
    if __name__ == "__main__":
        reges = [r".*.c", r".*.h", r".*.cpp"]
        event_handler = MyHandler(reges)
        observer = Observer()
        observer.schedule(event_handler, ".", recursive=True)
        observer.start()
    
        try:
            print("start my watch")
            while True:
                time.sleep(100)
        except KeyboardInterrupt:
            observer.stop()
        observer.join()

     代码二:

    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):
            if event.is_directory:
                print("directory moved from {} to {}".format(event.src_path,event.dest_path))
            else:
                print("file moved from {} to {}".format(event.src_path,event.dest_path))
                self.task(filName = event.dest_path)
    
        def on_created(self, event):
            if event.is_directory:
                print("directory created:{}".format(event.src_path))
            else:
                print("file created:{}".format(event.src_path))
    
        def on_deleted(self, event):
            if event.is_directory:
                print("directory deleted:{}".format(event.src_path))
            else:
                print("file deleted:{}".format(event.src_path))
    
        def on_modified(self, event):
            if event.is_directory:
                print("directory modified:{}".format(event.src_path))
            else:
                print("file modified:{}".format(event.src_path))
    
        def task(self,filName):
            print(filename)
            #具体任务
    
    if __name__ == "__main__":
        observer = Observer()
        event_handler = FileEventHandler()
        filePath = '/data/pcap'
        observer.schedule(event_handler,filePath,True)
        observer.start()
    
        time.sleep(100)
    
        observer.stop()
        observer.join()

      

    可以看到使用起来也是非常的简单:

    1,重新定义一个类继承FileSystemEventHandler类,重载四个事件函数即可。这四个函数对应的是文件的增删改,移动等事件。

    2,以on_moved函数为例,在该函数中处理对于文件移动事件的响应,我调用的是task函数,该函数可以根据实际的需求进行修改。

    3,将新类的对象,监控的文件目录作为参数传入observer.schedule函数,filePath即监控的文件目录,event_handler对象对于文件事件做出处理。

    4,observer.start()启动之后,一直是监听状态,除非显示的退出。我的示例程序中在监听100s之后退出,可以根据自身情况进行修改。

    使用过程中的注意事项:

    1,文件创建的动作其实会触发多种事件,包括FileCreatedEvent以及FileModifiedEvent时间,触发on_created以及on_modified函数,这是需要注意的。原因在于f = open(… , ‘w’) 这样文件创建动作会触发FileCreatedEvent事件,执行on_created函数; 在往文件些数据的时候例如f.flush() 和f.close()操作 会触发FileModifiedEvent事件,执行on_modified函数。

    2,前面也提到不同的操作系统平台基于不同的observer,在文件处理方面也可能会存在差异,因此对于不同的平台,最好详细测试一下文件的创建,写入,关闭的个操作会触发什么事件。

    3,我的业务场景是监控文件夹下面pcap报文的情况,并解码报文。我在Linux平台上的策略是在写数据的时候,我的文件名是xxx,在文件写完之后,我将文件名修改成为xxx.pcap。这个时候文件名的修改会触发文件移动事件,那么这个时候我在on_moved函数中执行对于pcap报文的解析就可以了。对于文件创建写入引发的修改和创建事件忽略即可。

    4,在实际处理过程中watchdog的对于事件的响应还是非常的及时。

  • 相关阅读:
    widget的进一步使用,利用AppWidgetProvider实现桌面的时钟挂件
    opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色
    opengl se画图
    绘制立方体和单个的矩阵,并映射纹理图像
    opengl的坐标和glFrustumf的设定及参数相关意义
    glDrawElements 和glDrawArrays
    spring mvc的拦截器
    spring mvc 文件上传
    spring mvc返回json字符串的方式
    springmvc的数据校验
  • 原文地址:https://www.cnblogs.com/tjp40922/p/14131094.html
Copyright © 2011-2022 走看看