ウォッチドッグを使用してディレクトリを監視し、変更されたばかりのファイルに対してアクションを実行する 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 更新機能を実行するためのアイデアだと思いましたが、これが発生している間、ディレクトリにコピーされた他のファイルは監視されない可能性があります。
ファイルシステムでウォッチドッグがこの関数アクションを破棄する方法はありますか? それとも、ウォッチドッグに、スクリプト自体によって実行されたすべてのアクションを破棄するように指示しますか?
よろしく、オジー。