Diese Frage ergibt sich aus einer anderen, die ich bei Stackoverflow gestellt hatte . Ich verwende Watcher - die gleichen Probleme treten auch bei Incron auf -, um einen Ordner und seine untergeordneten Ordner auf Änderungen zu überwachen und diese Änderungen stillschweigend in Dropbox zu verwerfen.
Ich verfolge das write_close
Ereignis IN_CLOSE_WRITE
zu diesem Zweck. Ursprünglich habe ich das modify
Ereignis beobachtet, also IN_MODIFY. Während dies funktionierte, stellte ich fest, dass es beim Schreiben großer Dateien mehr als einmal ausgelöst wurde. Das klang fair und ich wechselte zu, IN_CLOSE_WRITE
da ich der Meinung war, dass es angemessen war anzunehmen, dass es für eine bestimmte Datei nur einmal vorkommen würde.
Dies ist jedoch nicht der Fall. Selbst für eine sehr kleine Textdatei - nur ein Zeichen -, die in Nano erstellt wurde, tritt das Ereignis zweimal auf. Bestenfalls kann dies zu unnötigem Datenverkehr führen, wenn dieselbe Datei zweimal mit Dropbox synchronisiert wird. In meinem eigenen Fall führt dies zu einer Katastrophe, da ich beim ersten Ereignis die Synchronisierung durchführe und dann die serverseitige Datei lösche. Das Ergebnis - beim zweiten Ereignis wird die Dropbox-Nebendatei zu einer 0-Byte-Datei.
Ich beschäftige mich jetzt damit, indem ich mein Synchronisationsskript für 10s in den Ruhezustand versetze, bevor ich etwas anderes tue, und dann überprüfe ich, ob die fragliche Datei noch vorhanden ist, bevor ich die Dropbox-Synchronisation versuche. Dies funktioniert, weil bei der zweiten Iteration die Datei fehlt und das Skript gerade beendet wird.
Das klingt bestenfalls hackisch. Vielleicht kein schlechter Hack, aber ich würde es vorziehen zu verstehen - warum tritt das IN_CLOSE_WRITE
Ereignis überhaupt mehr als einmal auf?
Einige zusätzliche Informationen
- Stellen Sie sicher, dass nicht mehrere Watcher-Instanzen ausgeführt werden.
Ausgabe von ps ax|grep watcher.py
23880 ? Sl 0:01 python /usr/local/bin/watcher.py restart
24977 pts/0 S+ 0:00 grep --color=auto watcher.py
Das Dateisystem ist ext4
. Ich sollte erwähnen, dass ich genau das gleiche Problem mit Incron angetroffen habe. Ich starte den Watcher-Daemon über ein Batch-Skript, das über ausgeführt wird /etc/rc2.d
. Incron OTH startet über die Standardinstallation, ohne dass ich irgendwelche Probleme damit habe apt-get install incron
.
Das Wesentliche meiner watcher.ini
Datei ist unten dargestellt.
[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid
[job1]
watch=/path/to/watch
events=write_close
excluded=
recursive=true
autoadd=true
command=/home/datastore.php $filename
Ich habe das datastore.php
Skript auf das Nötigste reduziert, um sicherzustellen, dass es zweimal gestartet wird, ohne dass mein unordentlicher Dropbox-Upload und Quellcode gelöscht werden.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Ich habe dann eine kleine Datei auf dem fraglichen Pfad angelegt und dann geprüft /tmp/watcher
. Das Problem besteht weiterhin - die Datei enthält weiterhin zwei aufeinanderfolgende Einträge für $argv[1]
.
ext4
und ich bin mir ziemlich sicher, dass nicht zwei Instanzen von Watcher ausgeführt werden. Ich bin mit Incron auf dasselbe Problem gestoßen.
delete
Routine und es erneut versuchen?
unlink
das Problem nicht auftritt , bleibt es bestehen