我有两个文件夹~/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
。