使用inotifywait监控文件变动

inotifywait是 inotify-tools 包中提供的一个工具,它使用 inotify API 来监控文件/目录中的变动情况。

在archlinux上,我们可以使用下面命令来安装

sudo pacman -S --noconfirm inotify-tools

平时 inotifywait 会挂起在那里,直到文件/目录发生了要引起关注的事件后,它会退出并输出事件发生的场所、事件的名称以及引起事件的文件(当事件发生在目录上时才会输出).

inotifywait 最常用的选项有两个,一个是 -r 一个是 -e ,其中:

-r
表示递归监控子目录中文件发生的事件
-e
指定要监控的事件列表。对于备份系统来说,只需要监控 modify、create和delete三种事件就行了。

比如,我们运行

inotifywait -r -e modify,create,delete /tmp

表示监控 /tmp 目录及其子目录中文件修改、文件创建和文件删除三种事件。

这时程序一直在挂起状态

[lujun9972@X61 ~]$ inotifywait -r -e modify,create,delete /tmp
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.

这时在 /tmp 目录下新建一个文件

touch /tmp/newFile

则 inotifywait 进程退出,并输出如下信息

/tmp/ CREATE newFile

使用rsync同步变动

rsync是一款快速增量备份工具。它的具有以下几个特点使得它很适合用作做备份的工具:

  • 增量备份,只会传输修改过的内容
  • 可以在传输过程中实时解压缩,减少带宽消耗
  • 可以保持原来文件的权限、事件、软硬链接
  • 即支持本机复制,也支持远程复制

rsync常用法为:

rsync -avz --delete  src/ foo:/data

其中

-a
表示archive mode,即备份目录下的所有内容(包括子目录中的内容),并且保持软链接、文件属性、文件修改事件、文件的所有者和宿主信息不变,并且同步字符/块设备以及命名socket和fifo等特殊文件。
-v
表示输出备份的详细信息
-z
表示传输时进行压缩
–delete
删除备份目的地里src中没有的文件
src/
表示要备份的是src目录下的所有内容,注意这里最后的 / 不能去掉,否则会把src目录本身备份过去
foo:/data
表示备份的目的地是foo主机下的 /data/ 目录

整合起来

接下来我们只需要用个 while 死循环把两个工具整合起来就行了,非常简单

#!/bin/bash

if [[ $# -ne 2 ]];then

cat<<EOF

Usage $(basename $0) source_dir [host:]dest_dir

EOF

exit 0

fi source_dir=$1

dest_dir=$2

while :

do

inotifywait -r -e modify,create,delete ${source_dir} && rsync -avz ${source_dir}/ ${dest_dir} --delete

done

这里有必要说明的是,虽然用 inotifywait 能探测出文件具体做了什么改动,但实际上我们根本不需要知道具体的改变是什么。

我们只需要知道有所改变了,然后具体改变了什么由 rsync 来自己处理就行了。

原文地址:https://lujun9972.github.io/blog..

最新文章

  1. mysql压缩包安装配置
  2. android双击返回键退出程序的实现
  3. 由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件
  4. web api post传一个参数时 值永远是null
  5. Computer Science Theory for the Information Age-2: 高维空间中的正方体和Chernoff Bounds
  6. ECSHOP在线手册布局参考图--文章详情页 article.dwt
  7. &lt;四&gt; jQuery 事件
  8. Scala - 处理时间(nscala-time - Joda Time的scala封装)
  9. 10-3[RF] feature selection
  10. html向servlet传乱码解决办法
  11. Framebuffer原理、使用、测试系列文章,非常好的资料,大家一起学习
  12. How to call C/C++ sytle function from C# solution?
  13. JQuery实现点击按钮切换图片(附源码)--JQuery基础
  14. ButterKnife注解式绑定控件
  15. run `npm audit fix` to fix them, or `npm audit` for details
  16. Swift -- 中文版两大官方文档汇总
  17. slot是标签的内容扩展,也就是说你用slot就可以在自定义组件时传递给组件内容,组件接收内容并输出
  18. 10个HTML5美化版复选框和单选框
  19. [UE4]运行模式
  20. 20155212 2016-2017-2 《Java程序设计》第8周学习总结

热门文章

  1. Fluent API配置
  2. Model对象嵌套list赋值方式(备忘)
  3. Maven,SVN,快捷键,数据库等
  4. If you want the rainbow, you have to deal with the rain.
  5. [转]C#利用委托跨线程更新UI数据
  6. [转]Android时间获取与使用
  7. IOS开发入门你们准备好了吗?
  8. 华硕主板开启intel virtual technology以便支持虚拟机
  9. 非常全面的PHP header函数设置HTTP头的示例
  10. April 8 2017 Week 14 Saturday