首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lsyncd -单向同步,但对于整个文件夹

lsyncd -单向同步,但对于整个文件夹
EN

Unix & Linux用户
提问于 2021-10-28 15:26:49
回答 1查看 1.1K关注 0票数 1

我有两个文件夹~/A~/B。有一些内容。

我编写了一个lsyncd配置文件~/.config/lsyncd/lsyncd.conf

代码语言:javascript
复制
# 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是这样的:

代码语言:javascript
复制
lsyncd -nodaemon ~/.config/lsyncd/lsyncd.conf

注意:在运行上述命令的终端中,参数-nodemon只提供给我更多的信息。

在执行命令后,立即进行同步,并将文件夹~/A的内容传输到文件夹~/B。这样就好了。

根据我的配置文件,我希望如果我删除~/B中的一个文件,就不会从~/A中删除它--情况也是如此!这是一个通缉的行为-我想防止意外删除~/A文件夹中的内容。

但是在这一点上,我也希望lsyncd能够检测到文件夹~/B丢失了一个刚刚删除的文件,并通过将丢失的文件从~/A复制到~/B来再次同步文件夹,就像它在启动时所做的那样!但这种情况不会发生。

这是如何做到的呢?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-11-01 18:47:44

实际上,你有两个问题,可能应该分开处理。让我们先看看第二个,因为它更容易回答:

但是在这一点上,我也希望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。您的命令行将读到:

代码语言:javascript
复制
lsyncd -log Exec -nodaemon ~/.config/lsyncd/lsyncd.conf

这将记录所有进程lsyncd派生的命令行(在您的情况下,将记录到终端)。我非常有信心,当您发布这些命令行时(最好是作为原始问题中的更新),我们可以确定问题所在;它们应该显示rsync是如何执行的,包括命令行参数。也许我可以帮助分析,但老实说,我对rsync没有那么深入。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/675171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档