Watchdog: WinError 58 lässt den Watchdog bei den kommenden Ereignissen scheitern

Erstellt am 14. Sept. 2015  ·  4Kommentare  ·  Quelle: gorakhargosh/watchdog

Hallo zusammen,

Beim Überwachen eines Ordners in einem QNAP kann ich Ereignisse für neu erstellte Dateien abrufen. Handelt es sich bei der neuen Datei jedoch um ein Verzeichnis, stürzt der Watchdog mit einem Systemfehler ab.

Ich vermute, es liegt daran, dass die Datei noch kopiert wird, aber das sollte kein Grund sein, den Listener zum Absturz zu bringen.

Die Anwendung läuft unter Windows 8.1 Pro.
QNAP-Firmwareversion: 3.7.2 Build 20120719
Stapelverfolgung:

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.

Hilfreichster Kommentar

Ich suche jetzt auch nach einer Lösung zum Verzögern / Wiederholen des Dirwatcher-Threads auf:
OSError: [WinError 64] Der angegebene Netzwerkname ist nicht mehr verfügbar

Alle 4 Kommentare

Gleiches Problem hier, mit einem WinError 64 und der Meldung: Der angegebene Netzwerkname ist nicht mehr verfügbar. Dies geschieht, wenn der Ordner von einem Dateiserver bereitgestellt wird, der nicht mehr verfügbar ist (SMB-Freigabe).

Wie könnten wir diese Art von Fehlern erkennen, um später erneut zu versuchen, einen Beobachter anzuhängen?

Ich suche jetzt auch nach einer Lösung zum Verzögern / Wiederholen des Dirwatcher-Threads auf:
OSError: [WinError 64] Der angegebene Netzwerkname ist nicht mehr verfügbar

Ich hatte das gleiche Problem, bei dem ich beim Überwachen einer Remote-Dateifreigabe die Meldung WinError 64 erhielt. Am Ende habe ich einen winzigen Wrapper um die watchdog.utils.BaseThread-Klasse erstellt, mit dem ich den Fehler abfangen und wiederherstellen kann. Dann Monkeypatch die ursprüngliche BaseThread-Klasse mit meinem Wrapper, bevor ich einen Observer erstelle. In meinem speziellen Fall fange ich alle Ausnahmen ab, die in der run-Methode auftreten könnten, und füge sie einer Warteschlange hinzu, um sie in einem anderen Thread zu verwenden. Es ist eine hackige Lösung, aber es gibt nicht viele Optionen ohne Quellcodeänderungen.

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

Welche Lösung (Codeänderungen) möchten Sie in Watchdog sehen?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen