如何在文件修改时触发 rsync?

如何在文件修改时触发 rsync?

我可以与同步文件夹rsync -avz /directory /target,现在我希望如果我更改了文件就执行此操作,/directory这样rsync应该自动调用。

我正在使用 Virtual Box,Virtual Box 的共享文件夹真的很慢,特别是如果你有一个使用共享文件夹作为文档根目录的网页。有了它,rsync我就能够使用共享文件夹中的本地文件,并自动将其与文档根目录同步。

我希望有人知道该怎么做,但这crontab并不好,因为它每 x 分钟执行一次,所以如果我不做任何事情,它仍然会调用,rsync但如果我修改了我的文件,它就不会调用。

此致

答案1

crontab 不太好,因为它每隔 x 秒/分钟执行一次,所以如果我不执行任何操作,它仍然会调用 rsync,但如果我修改了文件,它就不会调用

rsync只会同步已更改的文件。如果没有任何更改,它将退出。这确实是一个最小的开销。

如果您对此不满意,可以使用inotifywait

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

这会更加即时,但它会做一些事情每一个节省的时间。

答案2

你可以使用Lsyncd(实时同步守护进程)

Lsyncd 监视本地目录树事件监视器接口(inotify 或 fsevents)。它会在几秒钟内聚合并组合事件,然后生成一个(或多个)进程来同步更改。默认情况下,这是 rsync。因此,Lsyncd 是一种轻量级实时镜像解决方案,安装起来相对容易,不需要新的文件系统或块设备,也不会影响本地文件系统的性能。

例如,Ubuntu 16.04 教程

答案3

您可以在启用事件的情况下使用inotifywaitrsync。这样,您只会在文件更改时与服务器同步,否则每次读取文件时都会同步(编辑者会多次读取您的文件以检查是否有任何更改)。因此说:inotifywaitmodify,create,delete

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done

答案4

稍微扩展一下对已接受答案的评论,我已经成功使用了样本触发将scp更改的文件发送到客户机。在 Linux 上,这是一个包装器,inotify但它也是跨平台的(我在 Mac 上安装了基于 Arm 的 QEMU 客户机)。我ssh还添加了远程构建。推送方法非常适合行为不太理想的共享。

相关内容