lsyncd -- Einwegsynchronisierung, jedoch für den gesamten Ordner

lsyncd -- Einwegsynchronisierung, jedoch für den gesamten Ordner

Ich habe zwei Ordner ~/Aund ~/B. Mit etwas Inhalt.

Ich schreibe eine lsyncdKonfigurationsdatei ~/.config/lsyncd/lsyncd.conf:

# NOTE: Use only absolute path names
# NOTE: check "man rsync" for parameters inside "rsync{}".

# Global settings
settings {
    logfile = "/home/ziga/.config/lsyncd/lsyncd.log",
    statusFile = "/home/ziga/.config/lsyncd/lsyncd-status.log",
    statusInterval = 5
}

# Synchronisation A ⟶ B
sync {
    default.rsync,
    source = "/home/ziga/A",
    target = "/home/ziga/B",
    delete = true,
    rsync = {
        binary = "/usr/bin/rsync",
        executability = true,
        existing = false,
    }
}

Und ich fange lsyncdso an:

lsyncd -nodaemon ~/.config/lsyncd/lsyncd.conf

Notiz:Der Parameter -nodemonist nur dazu da, mir im Terminal, in dem ich den obigen Befehl ausführe, weitere Informationen zu geben.

Unmittelbar nach der Ausführung des Befehls findet eine Synchronisierung statt und der Inhalt des Ordners ~/Awird in den Ordner übertragen ~/B. Das ist in Ordnung.

Laut meiner Konfigurationsdatei würde ich erwarten, dass wenn ich eine Datei in lösche ~/B, sie nicht aus gelöscht wird, ~/Awas auch der Fall ist! Und das ist ein gewünschtes Verhalten - ich möchte das versehentliche Löschen von Inhalten im Ordner verhindern ~/A.

An diesem Punkt würde ich aber auch erwarten, dass lsyncdes erkennt, dass in dem Ordner ~/Beine gerade gelöschte Datei fehlt, und die Ordner erneut synchronisiert, indem es die fehlende Datei von dort nach ~/Adort kopiert ~/B, so wie es das sofort beim Start tut!Aber das passiert nicht.

Wie kann das erreicht werden?

Antwort1

Eigentlich hast du zwei Fragen, die wahrscheinlich getrennt behandelt werden sollten. Schauen wir uns zuerst die zweite an, da sie einfacher zu beantworten ist:

An diesem Punkt würde ich aber auch erwarten, dass lsyncd erkennt, dass im Ordner ~/B eine gerade gelöschte Datei fehlt, und die Ordner erneut synchronisiert, indem es die fehlende Datei von ~/A nach ~/B kopiert, wie es das sofort nach dem Start tut!

Mit Ihrer Konfiguration können Sie keine sofortige Reaktion erwarten, wenn eine Datei gelöscht wird.Ziel. lsyncdüberwacht inotifyÄnderungen in derQuelleDateibaum. Tatsächlich weiß es nach der ersten Synchronisierung, die beim Start stattfindet, nicht, was imZiel. Stattdessen fordert sie von Zeit zu Zeit (siehe unten) dazu auf, rsyncdie Veränderungen in derQuelleBaum zumZiel.

Theoretisch lsyncdkönnte man das Ziel inotifyauch überwachen übersolange das Ziel lokal ist. Aber normalerweise ist das nicht der Fall. Nehmen wir an, das Ziel befindet sich auf einem Remote-Host (im Gegensatz zu Ihrem Beispiel). Wie könnte lsyncddann über eine Datei imRemote-Zielgelöscht?

Dies ist jedoch kein Problem: Beim nächsten lsyncdStart einer neuen Synchronisation (durch Ausführen von rsync) wird die Datei erneut erstellt. Das heißt, solange es keinesofortReaktion auf das Löschen einer Datei auf dem Ziel, wird diese Datei beim nächsten rsyncDurchlauf erneut kopiert. Der nächste rsyncDurchlauf erfolgt nach einer bestimmten Anzahl von Änderungen in derQuelleBaum (siehe unten) oder beim Start.

Bitte beachten Sie, dass Sie konfigurieren können, wie oft lsyncddie Synchronisierung über ausgeführt wird rsync. Soweit ich verstanden habe, gibt es ein Standard-Timeout, aber zusätzlich, wenn lsyncd1000 (Standardwert) Änderungen in derQuelleBaum (über inotify), dann wird es (unabhängig vom Timeout) ausgeführt, rsyncum alle auf einmal zu synchronisieren. Das ist natürlich viel besser, als rsyncnach jeder einzelnen Änderung auszuführen.

Kommen wir also zu Ihrer letzten Frage („Wie kann dies erreicht werden“):das geht überhaupt nichtoder erfordert etwas Programmierung. In jedem Fall müssten Sie einen Daemon ausführen, der auf Dateisystemänderungen auf demZielund führt dann selbständig rsyncdie Synchronisierung der Dateien aus demQuellezumZieloder der im Falle solcher Änderungen einen anderen Daemon benachrichtigt,Quellewas wiederum läuft rsync.

Aber dann bräuchten Sie nichts lsyncdweiter, denn mit diesem Wissen würden Sie wahrscheinlich Ihr eigenes Zweiwege-Synchronisierungssystem bauen.

Kommen wir nun zu Ihrem ersten Problem:

Laut meiner Konfigurationsdatei würde ich erwarten, dass wenn ich eine Datei in ~/B lösche, sie nicht aus ~/A gelöscht wird, was aber auch der Fall ist!

Ich kann nicht sofort sagen, was hier schief läuft; bei deiner Konfiguration dürfte das eigentlich nicht passieren. Ich habe jedoch einen Vorschlag zur weiteren Analyse:

Fügen Sie beim Starten lsyncdden Parameter hinzu -log Exec. Ihre Kommandozeile würde dann lauten:

lsyncd -log Exec -nodaemon ~/.config/lsyncd/lsyncd.conf

Dadurch werden die Befehlszeilen aller Prozesse protokolliert lsyncd(in Ihrem Fall im Terminal). Ich bin sehr zuversichtlich, dass wir das Problem identifizieren können, wenn Sie diese Befehlszeilen posten (vorzugsweise als Update Ihrer ursprünglichen Frage); sie sollten zeigen, wie rsyncausgeführt wird, einschließlich der Befehlszeilenparameter. Vielleicht kann ich bei der Analyse helfen, aber um ehrlich zu sein, bin ich nicht so tief drin rsync.

verwandte Informationen