Watchdog: WinError 58 يجعل المراقب يفشل في الأحداث القادمة

تم إنشاؤها على ١٤ سبتمبر ٢٠١٥  ·  4تعليقات  ·  مصدر: gorakhargosh/watchdog

تحية للجميع،

عند مراقبة مجلد داخل QNAP ، يمكنني الحصول على أحداث للملفات المنشأة حديثًا. ومع ذلك ، إذا كان الملف الجديد عبارة عن دليل ، فإن المراقبة تتعطل بسبب خطأ في النظام.

أظن أن السبب في ذلك هو استمرار نسخ الملف ، لكن لا ينبغي أن يكون هذا سببًا لتعطل المستمع.

التطبيق يعمل على Windows 8.1 Pro.
إصدار البرنامج الثابت QNAP: 3.7.2 Build 20120719
تتبع المكدس:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
    self.run()
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\api.py", line 146, in run
    self.queue_events(self.timeout)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\read_directory_changes.py", line 77, in queue_events
    winapi_events = read_events(self._handle, self.watch.is_recursive)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 347, in read_events
    buf, nbytes = read_directory_changes(handle, recursive)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 307, in read_directory_changes
    raise e
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 303, in read_directory_changes
    ctypes.byref(nbytes), None, None)
  File "C:\Python34\lib\site-packages\watchdog-0.8.3-py3.4.egg\watchdog\observers\winapi.py", line 108, in _errcheck_bool
    raise ctypes.WinError()
OSError: [WinError 58] The specified server cannot perform the requested operation.

التعليق الأكثر فائدة

أنا الآن أبحث أيضًا عن حل لتأخير / إعادة محاولة مؤشر ترابط dirwatcher على:
خطأ في نظام التشغيل: [WinError 64] اسم الشبكة المحدد لم يعد متاحًا

ال 4 كومينتر

نفس المشكلة هنا ، مع WinError 64 والرسالة: اسم الشبكة المحدد لم يعد متاحًا. يحدث هذا عندما يتم تقديم المجلد من خادم ملفات يصبح غير متوفر (مشاركة SMB).

كيف يمكننا اكتشاف هذا النوع من الخطأ ، لإعادة محاولة إرفاق مراقب لاحقًا؟

أنا الآن أبحث أيضًا عن حل لتأخير / إعادة محاولة مؤشر ترابط dirwatcher على:
خطأ في نظام التشغيل: [WinError 64] اسم الشبكة المحدد لم يعد متاحًا

واجهت نفس المشكلة حيث كنت أتلقى رسالة WinError 64 عند مراقبة مشاركة ملف بعيد. انتهى بي الأمر بإنشاء غلاف صغير حول فئة watchdog.utils.BaseThread التي تتيح لي اكتشاف الخطأ واستعادته. ثم أقوم بتثبيت فئة BaseThread الأصلية باستخدام برنامج التضمين الخاص بي قبل إنشاء Observer. في حالتي المحددة ، ألتقط أي استثناءات يمكن أن تحدث في طريقة التشغيل وأضفها إلى قائمة انتظار ليتم استهلاكها في سلسلة مختلفة. إنه حل مبتكر ، لكن لا يوجد الكثير من الخيارات بدون تغييرات كود المصدر.

import logging
import threading

import watchdog.utils

logger = logging.getLogger(__name__)


class BaseThreadWrapper(watchdog.utils.BaseThread):
    """
    Wrapper around watchdog BaseThread class.

    """
    queue = None

    def __init__(self):
        super(BaseThreadWrapper, self).__init__()
        self._original_run = self.run
        self.run = self.run_wrapper

    def run_wrapper(self):
        try:
            self._original_run()
        except Exception as e:
            logger.exception('%s thread exited with error',
                             threading.current_thread().name)
            self.queue.put(e)


watchdog.utils.BaseThread = BaseThreadWrapper

ما الحل (يتغير رمز) الذي تريد أن تراه في المراقبة؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات