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 に答える