The simple directory-watching script is below: import logging import sys import time from watchdog.events import FileSystemEventHandler from watchdog.observers import Observer class MyEventHandler(FileSystemEventHandler): def __init__(self, observer, log): self.log = log self.observer = observer def on_created(self, event): self.log.info("%s", event) def main(argv): logging.basicConfig(format = '%(asctime)s %(levelname)-8s %(message)s', datefmt = '%Y-%m-%d %H:%M:%S', level = logging.DEBUG) log = logging.getLogger(__name__) path = argv[1] observer = Observer() log.debug('Created observer %s', observer) event_handler = MyEventHandler(observer, log) observer.schedule(event_handler, path, recursive = False) observer.start() observer.join() return 0 if __name__ == "__main__": sys.exit(main(sys.argv)) Started as something like ./fpounce.py /tmp it works, but the observer-thread crashes as soon as a file is created in the watched directory (/tmp) by some other user (such as the www): 2025-07-09 14:30:41 DEBUG Created observer <KqueueObserver(Thread-1, initial daemon)> 2025-07-09 14:30:42 INFO FileCreatedEvent(src_path='/tmp/sess_e645f55f69770d25a08b8210245510f6', dest_path='', event_type='created', is_directory=False, is_synthetic=False) Exception in thread Thread-2: Traceback (most recent call last): File "/opt/lib/python3.11/threading.py", line 1045, in _bootstrap_inner self.run() File "/opt/lib/python3.11/site-packages/watchdog/observers/api.py", line 158, in run self.queue_events(self.timeout) File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 630, in queue_events self.queue_event(FileCreatedEvent(file_created)) File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 481, in queue_event self._register_kevent(event.src_path, is_directory=event.is_directory) File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 435, in _register_kevent self._descriptors.add(path, is_directory=is_directory) File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 215, in add self._add_descriptor(KeventDescriptor(path, is_directory=is_directory)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/lib/python3.11/site-packages/watchdog/observers/kqueue.py", line 294, in __init__ self._fd = os.open(path, WATCHDOG_OS_OPEN_FLAGS) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PermissionError: [Errno 13] Permission denied: '/tmp/sess_e645f55f69770d25a08b8210245510f6' Why is it trying to open the newly-created files? Can I disable this somehow -- or make failures non-fatal? Update: Just tested the same code on Linux -- no problem there with inotify. Must be something about kqueue watchdog-implementation in particular -- will have to file a bug-report, I suppose. Continue reading...