Watchdog:电脑每天在干嘛?
本文作者:王凯丽
文字编辑:周聪聪
技术总编:张学人
好消息!!!爬虫俱乐部将于2019年7月5日至7月8日在武汉举行首期Python编程技术定制培训。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python爬虫技术,并明确未来更进一步的学习方向。
详细培训大纲及报名方式,请点击文末阅读原文呦~
watchdog中文名称叫做看门狗,它是用来监控文件系统事件的Python第三方库和shell工具。watchdog可以用来监控文件系统内指定路径下目录或文件发生的变化。具体来说,文件系统发生变化时(包括移动、修改、创建或删除文件/目录等等)会在Windows系统中抛出相应信号,而watchdog正是通过捕捉这些信号,封装成事件类,并转交预备好的事件处理器进行处理。那么如何利用watchdog实现对文件系统的监控与处理呢?下面我们将通过一个例子为大家讲解watchdog的用法。
首先,在举例之前我们在命令行窗口安装watchdog第三方库:
pip install watchdog
一、实例操作
我们的电脑自从打开的那一刻就开始了繁忙的工作,那么我们的电脑每天都在做什么呢?现在我们可以通过watchdog实现对计算机的监控。比如我们想知道计算机的用户目录下(/home)文件或者目录被修改的情况,可以通过执行以下程序将结果打印到窗口上:
首先导入相关模块:
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler, LoggingEventHandler
其次,定义监控路径为计算机的用户目录:
WATCH_PATH = "/home"
再者,定义类FileMonitorHandler()为文件监控的处理器,其承继自FileSystemEventHandler类,FileSystemEventHandler表示用于处理文件系统发生变化的处理器。接着,定义方法on_modified(self, event),即当给定路径下的文件或目录被修改时,消息将会被打印到窗口上。
class FileMonitorHandler(FileSystemEventHandler):
def __init__(self,**kwargs):
super(FileMonitorHandler,self).__init__(**kwargs)
self._watch_path = WATCH_PATH
def on_modified(self, event):
if event.is_directory:
file_path = event.src_path
print("文件或目录被修改: %s " % file_path)
最后,运行代码块,利用watchdog.observers监控文件或目录发生变化,我们通过observer的schedule方法,将之前设计好的处理器绑定在observer上,这样一来,若observer启动后(observer.start()开始以后)捕捉到事件类,就可以自动转交给event_handler处理。此外,增加try/except语句来捕获程序的异常,如果程序运行正常,则每隔一秒触发一次事件处理器。其中time.sleep()表示将当前程序阻塞指定秒数,然后继续运行程序。
if __name__ =="__main__":
event_handler = FileMonitorHandler()
observer = Observer()
watch = observer.schedule(event_handler,path='.', recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
程序运行的最终结果如下:
从上图可以看出我的计算机主目录下的微信、谷歌浏览器、Python等等程序都在马不停蹄地工作。上述程序中涉及了watchdog的两个类watchdog.events 和watchdog.observers,下面我们将详细进行介绍。
二、watchdog.events
watchdog.events是那些触发了处理器的事件类。例如当文件被修改,它们就会被封装成一个事件,继而被处理器捕获并处理。
1. 事件类
事件类包括FileSystemEvent()、FileSystemMovedEvent()、FileMovedEvent()、 DirMovedEvent()、FileModifiedEvent()、DirModifiedEvent()、FileCreatedEvent()、DirCreatedEvent()、FileDeletedEvent()、DirDeletedEvent()。
其中,FileSystemEvent(src_path)表示当监控的文件系统发生变化时将会触发的文件系统事件。该事件类的属性包括is_directory、src_path、event_type等。其中is_directory表示若该事件由目录触发,则为True,否则为False;src_path表示触发该事件的源路径;event_type表示触发事件的类型。
FileSystemMovedEvent(src_path, dest_path)表示任何类型的文件系统发生移动时触发的事件。其中dest_path参数表示文件移动的目标路径。
FileMovedEvent(src_path, dest_path)表示文件被移动时触发的事件。
DirMovedEvent(src_path, dest_path)表示目录被移动时触发的事件。
FileModifiedEvent(src_path)表示文件被修改触发的事件。
DirModifiedEvent(src_path)表示目录被修改触发的事件。
FileCreatedEvent(src_path)表示文件被创建触发的事件。
DirCreatedEvent(src_path)表示目录被创建触发的事件。
FileDeletedEvent(src_path)表示文件被删除时触发的事件。
DirDeletedEvent(src_path)表示目录被删除时触发的事件。
2. 事件类的处理器
事件类的处理器包括FileSystemEventHandler()、loggingEventHandler()等。
其中,FileSystemEventHandler()表示用于处理文件系统发生变化的处理器,我们可以根据自己的需要来重写对应的方法。其中,子类dispatch(event)表示给发生的事件分配一个合适的方法。on_any_event(event) 可以针对所有触发的事件进行处理。on_created(event)捕捉并处理文件或目录被创建时产生的事件。on_deleted(event)捕捉并处理文件或目录被删除时产生的事件。on_modified(event)表示捕捉并处理文件或目录被修改会触发的事件。on_moved(event)针对文件或目录被移动时触发的事件进行处理。
loggingEventHandler()表示记录捕获所有发生的事件,即当指定路径下的目录或文件发生任何变化都会打印消息到终端。它是在watchdog.events.FileSystemEventHandler发生的基础上才会被触发。
三、watchdog.observers
watchdog.observers可以监控文件变化,触发对应的事件类,然后调用关联的事件处理器来处理事件。
observer.schedule(event_handler,path, recursive=False)表示调度监控路径并调用给定事件处理程序中指定的适当方法来响应文件系统事件。observer.start()表示发出线程开始的信号。observer.stop()表示发出线程停止的信号。observer.join()表示等待线程终止。
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。