我正在编写一个 python 脚本,它使用看门狗来监视目录并对刚刚修改的文件执行操作。我的问题是脚本对文件执行的操作用相同的文件重新填充了看门狗的事件列表,因此脚本进入无限循环。
无论如何要监视修改过的文件,并对它们执行操作而不会再次触发看门狗?
import os
import watchdog.events
import watchdog.observers
class OsyncStateHandler(watchdog.events.PatternMatchingEventHandler):
"""Writes state files"""
def __init__(self, replica):
self.replica = replica
ignore = list()
ignore.append(self.replica.path + self.replica.osync_dir + "*")
watchdog.events.PatternMatchingEventHandler.__init__(self, ignore_patterns=ignore)
self.move_file_handler = open(replica.moved_list_file, 'a')
def __del__(self):
self.del_file_handler.close()
def on_modified(self, event):
print(event.event_type)
print(event.key)
if (event.src_path == self.replica.path):
return
# Fix for Rsync: update mtime with ctime so rsync will aknowldge attr changes (chmod / setfacl only change ctime)
if (currentConfig['RSYNC_OPTIONS']['sync_attrs'].lower() == "yes"):
update_mtime_with_ctime(event.src_path)
self.mod_file_handler.write(event.src_path + '\n')
self.mod_file_handler.flush()
self.replica.increaseOss()
INITREPLICA = Replica(INITIATOR_TYPE, currentConfig['REPLICAS'][INITIATOR_TYPE])
fs_event_handler = OsyncStateHandler(INITREPLICA)
fs_observer = watchdog.observers.Observer()
fs_observer.schedule(fs_event_handler, INITREPLICA.path, recursive=True)
fs_observer.start()
try:
while True:
time.sleep(2)
except KeyboardInterrupt:
fs_observer.stop()
fs_observer.join()
我认为暂停观察者是执行我的 mtime 更新功能的一个想法,但是在发生这种情况时可能不会监视复制到目录的其他文件。
反正有没有让看门狗放弃文件系统上的这个功能动作?或者也许告诉看门狗放弃脚本本身所做的每一个动作?
问候,奥兹。