lsyncd — односторонняя синхронизация, но для всей папки

lsyncd — односторонняя синхронизация, но для всей папки

У меня есть две папки ~/Aи ~/B. С некоторым содержимым.

Я пишу lsyncdфайл конфигурации ~/.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,
    }
}

И я начинаю lsyncdтак:

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

Примечание:Параметр -nodemonнужен только для того, чтобы предоставить мне дополнительную информацию в терминале, где я запускаю указанную выше команду.

Сразу после выполнения команды происходит синхронизация и содержимое папки ~/Aпереносится в папку ~/B. Это нормально.

Согласно моему конфигурационному файлу, я ожидаю, что если я удалю файл в ~/B, он не будет удален из , ~/Aчто также имеет место! И это желаемое поведение - я хочу предотвратить случайное удаление содержимого в папке ~/A.

Но на этом этапе я также ожидаю, что программа lsyncdобнаружит, что в папке ~/Bотсутствует только что удаленный файл, и снова синхронизирует папки, скопировав отсутствующий файл из ~/Aв ~/B, как это происходит сразу при запуске!Но этого не происходит.

Как это может быть сделано?

решение1

На самом деле, у вас есть два вопроса, которые, вероятно, следует рассматривать отдельно. Давайте сначала рассмотрим второй, потому что на него легче ответить:

Но на этом этапе я также ожидаю, что lsyncd обнаружит, что в папке ~/B отсутствует только что удаленный файл, и снова синхронизирует папки, скопировав отсутствующий файл из ~/A в ~/B, как он делает сразу после запуска!

При вашей конфигурации вы не можете ожидать немедленной реакции при удалении файла вцель. lsyncdиспользует inotifyдля наблюдения за изменениями висточникФайловое дерево. На самом деле, после начальной синхронизации, которая происходит при запуске, он не знает, что происходит вцель. Вместо этого, время от времени (см. ниже), он призывает rsyncотражать изменения висточникдерево кцель.

Теоретически, можно также lsyncdконтролировать цель черезinotifyпока цель локальна. Но обычно это не так. Предположим, что цель находится на удаленном хосте (в отличие от вашего примера). Как lsyncdтогда можно уведомить о файле вудаленная цельудаляются?

Это не проблема, хотя: в следующий раз, когда lsyncdначнется новая синхронизация (выполнением rsync), файл будет создан снова. То есть, пока нетнемедленныйреакция на удаление файла на цели, этот файл будет скопирован снова в следующем rsyncзапуске. Следующий rsyncзапуск происходит после определенного количества изменений висточникдерево (см. ниже) или при запуске.

Обратите внимание, что вы можете настроить частоту lsyncdзапуска синхронизации через rsync. Насколько я понял, есть тайм-аут по умолчанию, но дополнительно, если lsyncdуведомления 1000 (значение по умолчанию) изменений висточникдерево (через inotify), затем (независимо от таймаута) он запускается rsyncдля синхронизации всех сразу. Конечно, это намного лучше, чем запуск rsyncпосле каждого изменения.

Итак, возвращаясь к вашему последнему вопросу («Как это можно сделать»),это вообще невозможно сделать, или требует некоторого программирования. В каждом случае вам придется запустить демон, который будет следить за изменениями файловой системы нацельа затем самостоятельно выполняет rsyncсинхронизацию файлов изисточниккцель, или который в случае таких изменений уведомляет другой демон висточниккоторый в свою очередь работает rsync.

Но тогда вам больше ничего не понадобится lsyncd, потому что, обладая этими знаниями, вы, вероятно, построите свою собственную систему двусторонней синхронизации.

Теперь давайте перейдем к вашей первой проблеме:

Согласно моему файлу конфигурации, я ожидаю, что если я удалю файл из ~/B, он не будет удален из ~/A, что также соответствует действительности!

Я не могу сразу сказать, что здесь не так; это действительно не должно происходить, учитывая вашу конфигурацию. Однако у меня есть предложение относительно дальнейшего анализа:

При запуске lsyncdдобавьте параметр -log Exec. Тогда ваша командная строка будет выглядеть так:

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

Это запишет командные строки всех lsyncdпорожденных процессов (в вашем случае, в терминал). Я очень уверен, что мы сможем определить проблему, когда вы опубликуете эти командные строки (предпочтительно, как обновление в вашем исходном вопросе); они должны показать, как rsyncвыполняется, включая параметры командной строки. Возможно, я могу помочь с анализом, но, честно говоря, я не так уж и глубоко в rsync.

Связанный контент