0

我正在编写一个 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 更新功能的一个想法,但是在发生这种情况时可能不会监视复制到目录的其他文件。

反正有没有让看门狗放弃文件系统上的这个功能动作?或者也许告诉看门狗放弃脚本本身所做的每一个动作?

问候,奥兹。

4

1 回答 1

0

没关系,我找到了一个令人讨厌但有效的解决方案。将刚刚修改的文件保留在列表中,如果下一个事件对应于该文件,则将其从列表中删除但不要继续执行。

    def __init__(self, replica):
            self.replica = replica
            self.ignore = list()
            self.ignore.append(self.replica.path + self.replica.osync_dir + "*")
            self.ignoreevents = list()
            watchdog.events.PatternMatchingEventHandler.__init__(self, ignore_patterns=se$
            self.mod_file_handler = open(replica.modded_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
            if (event.src_path in self.ignoreevents):
                    self.ignoreevents.remove(event.src_path)
                    return

            # Fix for Rsync: update mtime with ctime so rsync will aknowldge attr changes$
            if (CONFIG['RSYNC_OPTIONS']['sync_attrs'].lower() == "yes"):
                    # Precision of ctime only works in Python 3+
                    ctime = os.path.getctime(event.src_path)
                    os.utime(event.src_path, (ctime, ctime))
                    self.ignoreevents.append(event.src_path)
            self.mod_file_handler.write(event.src_path + '\n')
            self.mod_file_handler.flush()
            self.replica.increaseOss()
于 2016-02-27T10:46:47.347 回答