Hai,
Saya menggunakan pengawas untuk memantau file baru di sistem file dan memicu pemrosesan otomatisnya. Apa yang terjadi adalah bahwa utas tidak memiliki akses ke file tertentu dan macet. Apakah ada cara untuk memberikan penangan kesalahan kepada pengawas? Atau terus memantau file lain?
Di bawah ini adalah contoh traceback.
Hernan
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'
Ini juga berdampak pada inotify ketika pertama kali mencoba mengatur arloji di atas direktori yang kebetulan berisi subdirektori yang tidak dapat dibaca/didaftarkan.
Saya juga mendapatkan kesalahan ini menggunakan inotify untuk menonton direktori yang menyertakan sub-direktori yang sangat bersarang sehingga saya tidak memiliki izin untuk membacanya:
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
Jadi, eh, masalah ini sudah dibuka sejak 2011. Apakah pemilik repo ini tidak lagi memelihara Watchdog? Saya juga baru saja mengalami ini.
Silakan komentar, @gorakhargosh
Wah, masalah ini sudah cukup lama!
[...] Apakah ada cara untuk menyediakan penangan kesalahan kepada pengawas? Atau terus memantau file lain?
Untuk saat ini yang terbaik yang dapat Anda lakukan adalah menjadwalkan pengamat non-rekursif.
Itu adalah sesuatu yang cukup tersebar dalam kode, dan ini merupakan masalah penanganan waktu pembuatan pengamat dan masalah penanganan emitor , karena akses terlarang dapat terjadi kapan saja (dengan chmod
, chown
atau alat SELinux ). Apakah Anda tahu bagaimana itu bisa diperbaiki dengan benar di API (selain peretasan kotor)?
Mungkin errno.EACCES
(yang mengingatkan saya pada #459) harus ditangani secara default dengan mengeluarkan beberapa peringatan, sehingga tidak melarang menonton direktori yang tersisa. Tapi sepertinya itu tidak cukup untuk menyelesaikan masalah ini.
Ini pada dasarnya membuat setiap kasus penggunaan di mana ada banyak pengguna tidak dapat digunakan. Acara lain yang tidak berfungsi... pengguna memiliki direktori 700 untuk mereka, mereka menyalin direktori ke pohon yang diawasi. Itu tidak akan crash, itu hanya memberikan kesalahan. chmod 755 jadi sekarang proses pengawas dapat membaca semua file di pohon. tidak.
mungkin hanya membuat semacam os-error sebagai acara tambahan? pengguna hanya dapat memutuskan apa yang harus dilakukan dengannya.
yang mungkin akan terbersih.
Komentar yang paling membantu
Jadi, eh, masalah ini sudah dibuka sejak 2011. Apakah pemilik repo ini tidak lagi memelihara Watchdog? Saya juga baru saja mengalami ini.
Silakan komentar, @gorakhargosh