watchdogを使ってファイルを監視する
カレントディレクトリの*.log
に変更があった場合にMyHandler内のメソッドが実行される。
最初は.logファイルで修正したらon_modified
が呼ばれると考えていたが、実際はon_deleted
、on_created
の順番で呼ばれていた。
class MyHandler(PatternMatchingEventHandler): def __init__(self, command, patterns): super(MyHandler, self).__init__(patterns=patterns) self.command = command def _run_command(self): subprocess.call([self.command, ]) def on_moved(self, event): print("called on_moved") def on_created(self, event): print("called on_created") def on_deleted(self, event): print("called on_deleted") def on_modified(self, event): print("called on_modified") def watch(path, command, extensions): event_handler = MyHandler(command, extensions) observer = Observer() observer.schedule(event_handler, path, recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() if __name__ == '__main__': watch("./", "ls", ["*.log"])
念のため、別のイベントハンドラを使って試してみた。
同様に.logファイルを更新した場合の動作。
この場合だと、以下の順番で実行される
- file './secure_test.log' deleted.
- file './secure_test.log' created.
- directory './' modified.
- directory './.idea' modified.
class EventHandler(FileSystemEventHandler): def on_created(self, event): if event.is_directory: print('directory \'{0}\' created.'.format(event.src_path)) else: print('file \'{0}\' created.'.format(event.src_path)) def on_modified(self, event): if event.is_directory: print('directory \'{0}\' modified.'.format(event.src_path)) else: print('file \'{0}\' modified.'.format(event.src_path)) def on_deleted(self, event): if event.is_directory: print('directory \'{0}\' deleted.'.format(event.src_path)) else: print('file \'{0}\' deleted.'.format(event.src_path)) def watch(): event_handler = EventHandler() observer = Observer() observer.schedule(event_handler, "./") observer.start() try: while True: time.sleep(10) except (Exception, KeyboardInterrupt): observer.stop() observer.join() if __name__ == '__main__': watch()
まとめ
どうやら、modifiedが実行されるのはディレクトリに変更があった場合に限るらしい
最初のプログラムではカレントディレクトリ以下の.logファイルのみを見ているため、modifiedが実行されなかったと思われる。
ファイルの変更をキャッチする場合は、delete
、create
の順番で実行されたことが確認されたら処理するようにするのが良い。
ファイルの生成時はcreate
が実行される
ファイルの削除時はdelete
が実行される
ファイルの編集時はdelete
、create
が実行される
ファイル名を変更した場合はmove
が実行される