当前位置: 首页 > Linux

跨平台fswatch+rsync同步备份

时间:2023-04-06 23:57:45 Linux

rsync很好用,不过也只是一个优秀的cp。如果要监控一些本地文件的变化并自动上传,需要配合其他监控工具。一般叫watch,notify什么的。最著名的是inotify。但是inotify是linux内核的东西,不能在Mac上运行。Mac上的替代方案是fswatch,它可以跨平台运行(不过目前发现只有mac支持最好)。fswatch非常简单易用。它不需要配置文件或复杂的参数。一个真正可行的自动备份脚本,经过几分钟的学习就可以完成。其实作为一个“替代品”,它远比inotify等好用很多。在其官方的Github描述中,也列出了目前最常用的inotify、kqueue等的缺点。参考GIthub官网:https://github.com/emcrisosto...安装(Mac):$brewinstallfswatch使用,先直接输入命令试试:#开始监控(进入block阻塞模式,动态输出changes)#假设监控/tmp文件夹fswatch-0/tmp|whileread-d""事件;doecho"Thisfile${event}haschanged."done然后在/tmp文件夹中随意新建一个文件:touch/tmp/000000.txt这时候刚才监听的shell会立即显示新建的文件name/tmp/000000.txt使用fswatch+rsync备份如果要监控/path/to/source/文件夹,那么:fswatch$1|whileread-d""事件;dorsync-rauv--delete--progress/path/to/source//path/to/target/done但是fswatch会默认进入阻塞模式,也就是一直挂在shell中。如果我们让它在后台运行,只需要在done后面加一个&就可以切换到后台了。多路径备份虽然fswatch可以同时监控多个目录:比如fswatch[options]...path-0...path-n,但是一般我们对每个不同的文件夹做不同的事情。因此,最简单方便的方法就是同时运行多个fswatches。但是默认情况下,一个fswatch是进入阻塞模式的,所以每次结束之后,比如done&,都要调到后台。直接新建脚本rsync.sh,输入代码如下:#Task1fswatch$1|whileread-d""事件;做rsync-rauv--delete--progress/path/to/source1//path/to/target1/done&#Task2fswatch$1|whileread-d""事件;dorsync-rauv--delete--progress/path/to/source2//path/to/target2/done&这样我们就不需要使用crontab来准时执行了。相反,fswatch会在每次监视到更改时自动执行该语句。至于fswatch的实现原理,这涉及到Kernel内核的多任务运行机制。例如,cronjob是周期性地运行一个任务,而fswatch使用消息通知,只有在有变化时才运行任务。要了解更多原理,请查看epoll和异步IO等相关主题。在这里,只知道如何使用它。