Tech:本机和远端目录同步

Mac机器的文稿目录要和服务端的文稿(服务端负责静态渲染)目录同步。

需求阐述

任务: 服务器端有一个目录(origin)要同步。

当然客户端做了修改也应该同步回去,并且服务端没有 GUI 桌面。这里选择的工具是 rsync

  • Mac 和 Debian 系统一般都自带了 rysnc
  • 先说一下: rsync 或许没有想象中的那么”智能”,但方便根据需要定制

如果只是客户端要向渲染服务器推送(push)的话,那用 git 就好了。

简单使用

本机测试: 从 orgin -> dest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
➜  Desktop mkdir origin dest
➜ Desktop
➜ Desktop ls origin dest
dest:

origin:
➜ Desktop echo 'hi' > origin/test.txt
➜ Desktop
➜ Desktop ls origin dest
dest:

origin:
test.txt
➜ Desktop rsync origin/* dest/
➜ Desktop ls origin dest
dest:
test.txt

origin:
test.txt

然后没有修改的情况,再运行没有拷贝。

如果要同步子目录,需要加上 -r 选项,此时不用加通配符:

1
rsync -r origin/ dest/

注意一定要加上/,否则该目录也会同步到目标里

常用选项

通常不会去单独使用 -r 或者加上通配符 *,而是直接使用 -a 选项。

如果要检查运行之前,哪些项目会同步: --dry-run -v 试试。(会看到只同步修改过的)

1
2
3
4
5
6
$ rsync -av --dry-run origin/ dest/
building file list ... done
./

sent 116 bytes received 26 bytes 284.00 bytes/sec
total size is 7 speedup is 0.05

默认情况下,是单方向的同步,根据你写的source,同步到dest。

即,如果dest里面有多余的文件,没有关系,它们不会被同步策略改变

如果需要让 dest 和 src 完全保持一致(mirror),那么就需要加上 --delete 命令。

1
$ rsync -av --delete origin/ dest/

这样同步的同时,会把 dest 里面额外的文件、文件目录删除。(包括隐藏的)

远端传输(跨机器备份)的时候,为减少网络传输数据,一般都会压缩,此时使用 -z

需要查看进度条怎么办? -P 会显示一个进度条。

总结: -a, -v, --dry-run, --delete-zP

其他比如 --daemon, --password-file一般用不到,给一篇参考

跨机器使用

类似 scp 命令(使用ssh),不过 rsync 是增量拷贝。

本机到远端同步,常用的命令大概是:

1
rysnc -zaP source/ username@ip_domain:dest/

反过来是一样的,只不过交换一个位置。

双向同步

可以看到如果要双向同步,必须还需要一个文件目录监控程序

双向同步的时候,让远端自动同步,让我方手动同步。

先确保你的机器(mac)可以被连接:

allow-login

最好设置一下免秘钥连接。(把服务器的公钥写入 ~/.ssh/authorized_keys里面,多秘钥需配置 host)

确保服务器能自动连接客户端机的时候,就可以设置自动同步了。

具体可以借助 inotify 或者其他工具。(我没有使用,这里就不介绍了; 需要内核支持)这里有一篇参考

我还是更加习惯自己一手掌控。

害怕像C++编译器一样,不花费大力气排查,你永远不知道它偷偷为你做了什么。

个人场景

本地和远端的 posts 文件夹要同步,但是由于两端都可能进行修改:

  • 服务端自动生成 permalink,同时创建文件也是服务端
  • 客户端(我这里)需要编写内容通不过去

因为我工作的时候一定会有一个 ssh 连接到服务器,那么最简单的不过的方式,两端都设置一下 rync 就好了。

1
2
$ which postpush
postpush not found

那么就设置一下 postpush 就好了。(我习惯使用 wikipush, workpush 之类的命令)

客户端:

1
$ alias postpush='rsync -avz --delete <source> ch-yk@server_ip:<dest>'

服务器:

1
$ alias postpush='rsync -avz --delete <source> ch-yk@client_ip:<dest>'

最好还是加入到各自的环境变量中,比如 bashrc。


先这样吧,最好别定制的太厉害,否则如若有迁移,那将是万分痛苦。

文章目录
  1. 1. 需求阐述
  2. 2. 简单使用
  3. 3. 常用选项
  4. 4. 跨机器使用
  5. 5. 双向同步
  6. 6. 个人场景
|