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 bestehenAntworten:
Ich bin nicht sicher, aber höchstwahrscheinlich schreibt die erste write_close Dateiattribute, wie die Erstellungszeit, und erst danach werden die tatsächlichen Daten geschrieben. Tatsächlich erstellt rsync eine temporäre Datei, und wenn alles erledigt ist, verschiebt es die temporäre Datei in die eigentliche Datei im selben Ordner, so dass es einfach zu überwachen ist, wenn Sie rsync verwenden. Das Verschieben ist eine atomare Operation. Auf der anderen Seite gibt es etwas, das man in inotify erschossen hat, wahrscheinlich das man damit bei der ersten Änderungsnachricht etwas auslösen kann, und wie Sie vorgeschlagen haben, für eine angemessene Zeit vor dem Start der Operation schlafen zu gehen. Ich grabe das jetzt und werde es aktualisieren, wenn ich etwas Neues finde. /superuser/1133642/traceing-the-moment-when-file-is-complete-copied-to-samba-share-with-inotify
quelle
Ich habe nicht genug Mitarbeiter, um dies als Kommentar zu posten, aber sind Sie sicher, dass keine temporären, möglicherweise ausgeblendeten Dateien erstellt werden? Ich hatte ein ähnliches Problem beim
inotifywait
mehrmaligen Auslösen, aber mir wurde klar, dass vim beim Bearbeiten eine .swp-Datei erstellen würde, die beim Schließen ein Ereignis auslösen würde. Es würde auch das Abschlussereignis aus der Originaldatei übernehmen.Es hört sich so an, als würden Sie feststellen, dass ein Ereignis mehrere Dateien auf dieselbe Datei abfeuert, was ich nicht reproduzieren konnte - dies würde nur einmal für die temporäre Datei und einmal für das Original geschehen.
Ich habe einen Schnelltest mit Nano versucht und glaube nicht, dass es überhaupt eine temporäre Datei erstellt (zumindest für die wenigen Zeichen), aber gibt es noch etwas in Ihrem Setup, das sich auf ein ähnliches Verhalten stützen könnte?
quelle