У меня есть две папки ~/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
.