やあ、
ウォッチドッグを使用して、ファイルシステム内の新しいファイルを監視し、それらの自動処理をトリガーします。 何が起こるかというと、スレッドは特定のファイルにアクセスできず、クラッシュします。 ウォッチドッグにエラーハンドラーを提供する方法はありますか? それとも、他のファイルの監視を継続しますか?
以下は、トレースバックの例です。
ヘルナン
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 530, in **bootstrap_inner
self.run()
File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/api.py", line 192, in run
self.queue_events(self.timeout)
File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 703, in queue_events
new_snapshot)
File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 548, in _queue_dirs_modified
self.queue_event(DirCreatedEvent(directory_created))
File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 520, in queue_event
self._register_kevent(event.src_path, event.is_directory)
File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 470, in _register_kevent
self._descriptors.add(path, is_directory)
File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 257, in add
self._add_descriptor(KeventDescriptor(path, is_directory))
File "/Users/X/Documents/code/envs/Y/lib/python2.7/site-packages/watchdog/observers/kqueue.py", line 342, in __init**
self._fd = os.open(path, WATCHDOG_OS_OPEN_FLAGS)
OSError: [Errno 13] Permission denied: '/Users/X/Public/Y/FOLDER'
これは、読み取り/一覧表示できないサブディレクトリが含まれているディレクトリを最初に監視するときに、inotifyにも影響します。
また、inotifyを使用して、読み取り権限がない深くネストされたサブディレクトリを含むディレクトリを監視すると、このエラーが発生します。
Traceback (most recent call last):
File "./manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
utility.execute()
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/djsupervisor/management/commands/supervisor.py", line 163, in run_from_argv
return super(Command,self).run_from_argv(argv)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/base.py", line 242, in run_from_argv
self.execute(*args, **options.__dict__)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/django/core/management/base.py", line 285, in execute
output = self.handle(*args, **options)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/djsupervisor/management/commands/supervisor.py", line 186, in handle
return method(cfg_file,*args[1:],**options)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/djsupervisor/management/commands/supervisor.py", line 264, in _handle_autoreload
observer.start()
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/api.py", line 255, in start
emitter.start()
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/utils/__init__.py", line 111, in start
self.on_thread_start()
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify.py", line 121, in on_thread_start
self._inotify = InotifyBuffer(path, self.watch.is_recursive)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_buffer.py", line 35, in __init__
self._inotify = Inotify(path, recursive)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 187, in __init__
self._add_dir_watch(path, recursive, event_mask)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 371, in _add_dir_watch
self._add_watch(full_path, mask)
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 385, in _add_watch
Inotify._raise_error()
File "/home/roger/.virtualenvs/fdw/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 406, in _raise_error
raise OSError(os.strerror(err))
OSError: Permission denied
それで、ええと、この問題は2011年から開かれています。このリポジトリの所有者はもはやWatchdogを維持していませんか? 私もこれに遭遇しました。
コメントしてください、 @ gorakhargosh
おっと、この問題はかなり古いです!
[...]ウォッチドッグにエラーハンドラーを提供する方法はありますか? それとも、他のファイルの監視を継続しますか?
今のところ、できる最善のことは、非再帰的なウォッチャーをスケジュールすることです。
これはコードにかなり散在しているものであり、禁止されたアクセスはいつでも発生する可能性があるため( chmod
、 chown
またはSELinuxツールを使用)、ウォッチャーの作成時間処理の問題とエミッター処理の問題の両方です。 )。 それをAPIで適切に修正する方法について何か考えがありますか(ダーティハック以外)?
おそらく、 errno.EACCES
(#459を思い出させる)は、残りのディレクトリの監視を禁止しないように、デフォルトで警告を発行して処理する必要があります。 しかし、それだけではこの問題を解決するには不十分なようです。
これにより、基本的に、複数のユーザーが使用できないユースケースが発生します。 動作しない別のイベント...ユーザーが700のディレクトリを持っている場合、そのディレクトリを監視対象ツリーにコピーします。 クラッシュすることはなく、エラーが発生するだけです。 chmod 755なので、ウォッチドッグプロセスはツリー内のすべてのファイルを読み取ることができます。 そうではありません。
おそらく、ある種のOSエラーを追加のイベントにするだけですか? ユーザーはそれをどうするかを決めることができます。
それはおそらく最もきれいでしょう。
最も参考になるコメント
それで、ええと、この問題は2011年から開かれています。このリポジトリの所有者はもはやWatchdogを維持していませんか? 私もこれに遭遇しました。
コメントしてください、 @ gorakhargosh