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.
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?
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