我想谈谈我尝试仅使用免费的开源组件(包括
rclone ,
entr和
systemd)为Linux创建一个简单的单行Dropbox客户端的尝试。
语境
最近,专用于Linux的Dropbox客户端放弃了对除
未加密ext4之外的所有Linux文件系统的支持。 不幸的是,我的主目录是加密的。
在12月初,专有客户停止工作。 他注销并建议在“支持的文件系统”中选择其他同步文件夹。
顺便说一句,我在两年的Thinkpad t460上运行Ubuntu Bionic。
为什么我需要Dropbox
我积极使用
组织模式 :我以纯文本形式记笔记,而Dropbox在键入时连续创建笔记的备份副本。
如果您还从事存储基础架构领域的工作,那么我的用例与“单主机异步复制”非常相似,也就是说,只有一个主机。 所有条目都通过我的Thinkpad,这是主机。 Dropbox远程文件夹只是一个只读副本,有时我会“发出只读请求”或将其用作当前向导失败或被盗时创建新向导的备份。
但是,此复制设置多次挽救了我的生命。 我仍然想知道Thinkpad在第二年会议期间如何拒绝启动。 由于我不断地在Dropbox中复制所有笔记,因此我没有丢失任何数据,并且能够查看妈妈的Macbook上的最新笔记。 谢谢妈妈!
尝试失败
当Dropbox客户端停止工作时,我专注于为Linux寻找另一个类似的多功能远程客户端。 原则上,我不介意切换到其他服务,例如Google Drive或AWS S3。 一些选项是
overGrive和
insync 。
但是,我得出的结论是这些解决方案过于实用,
并不适合我的情况 。
例如,客户端尝试
将远程文件系统连接到PC 。 他们非常努力地抽象远程文件系统,使它们看起来像本地文件系统。 通常,它们实现双向同步,将远程文件类型自动映射到Linux文件类型等。
我不需要这种抽象水平。 在我打字时,需要一些简单的方法来不断备份云中的笔记。 另外,抽象使调整和调试变得困难。 更不用说大多数这些多功能客户端是专有的。
克隆
我
rclone
实用程序,然后我立即意识到:这正是我想要的。 一个简单但功能强大的程序。 与
rsync
工具非常相似,仅适用于云存储。
例如,
rclone
负责容错(完整性检查),具有高效的同步算法等,同时提供了一个
简单的CRUD接口来与流行的云存储服务(包括Amazon S3,Google Drive和Dropbox)进行交互。
以下命令将远程
org
目录与本地目录
/home/lpan/org
同步。
ORG_DIR=/home/lpan/org REMOTE=dropbox rclone sync $ORG_DIR $REMOTE:org
输入
执行
entr命令的实用程序使用
inotify API。 本质上,它在更改文件时运行命令而不
轮询文件系统。
一种常见的用例是,
如果源文件之一已更改 ,则
重建项目 。
entr
从
stdin
获取绝对路径的列表,然后如果观察到的任何文件已更改,则执行作为参数传递的命令。
WORKDIR=/path/to/myproject find $WORKDIR | grep "\.cpp$" | entr make
单行脚本
现在我们有了
rclone
和
entr
。 生成的脚本非常简单。 让我提醒您,我的Dropbox用例非常简单:您只需要在本地Org文件更改时不断复制它们。 因此,您可以使用
entr
监视文件,并使用
rclone
与远程存储“同步”。
生成的脚本(
/home/lpan/sync_dropbox.sh
)如下:
运行守护程序
守护程序只是在后台运行的计算机程序。 我们将脚本作为后台进程,以便它不断在后台将本地文件更改与远程文件系统同步。
systemd提供了用于控制守护进程的接口。
我在
~/.config/systemd/user/dropbox.service
创建了
Dropbox服务 。
[Unit] Description=Dropbox Daemon [Service] ExecStart=/home/lpan/sync_dropbox.sh Restart=always [Install] WantedBy=default.target
然后,您可以使用以下命令控制守护程序:
结论
在本文中,我们讨论了如何应用UNIX哲学并使用一组免费的开放源代码工具来替换专有的和旧的Dropbox客户端。 我们使用
rclone
和
entr
。 我还展示了如何使此进程成为守护进程并使用
systemd
对其进行管理。
我想提醒您,关键思想是简单性。 我们需要用于简单任务的简单解决方案。 我的Dropbox用例非常简单。 这就是为什么单行脚本比使用功能过度且专有的云客户端更好的原因。
非常感谢您的阅读! 我真的希望您喜欢这篇文章。 如果您知道执行相同操作或为另一个用例扩展脚本的最佳方法-请在评论中告诉我!