备份方法scp rsync,inotifywait

2024-05-09 06:07:32

备份方法scp rsync,inotifywait

博客分类: linux

SSH inotify 脚本

参考http://blog.leezhong.com/project/2010/12/13/inotify-rsync.html
https://github.com/rvoicilas/inotify-tools/wiki/
远程执行脚本
ssh -l root 10.10.10.10 "/opt/test/stop.sh";
ssh -l root 10.10.10.10  "scp /opt/data/database.tcb 10.10.10.10:/opt/ttserver/test/test.tcb"

rsync+inotifywait

Java代码   收藏代码
  1. #!/bin/sh
  2. /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' \
  3. -e modify,create,move  \
  4. /opt/cms5/share/template/cms_page/template/ \
  5. while read date time file event
  6. do
  7. rsync -av --progress  --include=kk  --exclude='*' --password-file=/etc/rsyncd.secrets /opt/backuptest/ haha@10.1.224.171::test >>/opt/log/templatenotify.log
  8. #echo "${date} ${time} ${file} ${event}"
  9. done
Java代码   收藏代码
  1. #!/bin/sh
  2. #/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w %f %e' \
  3. /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w %f %e' \
  4. -e modify,create,move  \
  5. /opt/backuptest/ \
  6. while read date time path file event
  7. do
  8. #               rsync -av --password-file=/etc/rsyncd.secrets /opt/rsynctest/ test@10.10.10.10::rsynctest >>/tmp/rsync.log
  9. rsync --include='${file}' --exclude='*' -av  ${path}  root@10.1.224.171:${path}
  10. echo "${date} ${time} ${path} ${file} ${event}"
  11. done

--------templatenotify.sh----------

Java代码   收藏代码
  1. #!/bin/sh
  2. #this is a test  not used for production ,please look 154
  3. logfile="/opt/log/templatenotify-`date +%Y%m%d`.log"
  4. toip=10.11.10.10
  5. /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' \
  6. -e CLOSE_WRITE,delete,create,move  \
  7. /opt/template/ \
  8. while read date time  file event
  9. do
  10. case "$event" in
  11. DELETE)
  12. echo "delete ${file} but not rsync ----delete--- over" >>${logfile};
  13. ;;
  14. *)
  15. if [ "${file: -4}" != '4913' ]  && [ "${file: -1}" != '~' ]; then
  16. echo "rsync -av  $file  root@${toip}:`dirname $file`" >>${logfile}
  17. rsync -av  $file  root@${toip}:`dirname $file`  >>${logfile} 2>&1
  18. echo "${date}  ${time}  ${file} ${event} --------over" >>${logfile}
  19. fi
  20. ;;
  21. esac
  22. done

定时删除无用文件比如log
crontab -l
0 3 * * * (find /opt/modules/ -type f -mtime +2 -exec rm -f {} \;)

Java代码   收藏代码
  1. [@tc_157_49 share]# cat /usr/local/src/switch/templatenotify.sh
  2. #!/bin/sh
  3. #this is a test  not used for production ,please look 154
  4. logfile="/opt/log/templatenotify-`date +%Y%m%d`.log"
  5. toip=10.11.157.53
  6. /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' \
  7. -e CLOSE_WRITE,delete,create,move  \
  8. /opt/cms5/share/template/cms_page/template/ \
  9. while read date time  file event
  10. do
  11. case "$event" in
  12. DELETE)
  13. echo "delete ${file} but not rsync ----delete--- over" >>${logfile};
  14. ;;
  15. *)
  16. if [ "${file: -4}" != '4913' ]  && [ "${file: -1}" != '~' ]; then
  17. echo "rsync -av  $file  root@${toip}:`dirname $file`" >>${logfile}
  18. rsync -av  $file  root@${toip}:`dirname $file`  >>${logfile} 2>&1
  19. echo "${date}  ${time}  ${file} ${event} --------over" >>${logfile}
  20. fi
  21. ;;
  22. esac
  23. done
  24. 概要 - 为什么需要监控文件系统?

    在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如:
  25. 通知配置文件的改变
  26. 跟踪某些关键的系统文件的变化
  27. 监控某个分区磁盘的整体使用情况
  28. 系统崩溃时进行自动清理
  29. 自动触发备份进程
  30. 向服务器上传文件结束时发出通知
通常使用文件轮询的通知机制,但是这种机制只适用于经常改变的文件(因为它可以确保每过x秒就可以得到i/o),其他情况下都非常低效,并且有时候会丢失某些类型的变化,例如文件的修改时间没有改变。像 Tripwire这 样的数据完整性系统,它们基于时间调度来跟踪文件变化,但是如果想实时监控文件的变化的话,那么时间调度就束手无策了。Inotify就这样应运而生了。 本文将简要介绍inotify,告诉我们如何监控文件夹,如何一有变化就报告相关消息事件,并介绍了一些相关工具, 我们可以把它们添加到自己的工具箱中。

Inotify到底是什么?

Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。在BSD和Mac OS系统中比较有名的是 kqueue,它可以高效地实时跟踪Linux文件系统的变化。近些年来,以 fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。如何知道你的Linux内核是否支持Inotify机制呢?很简单,执行下面这条命令:
% grep INOTIFY_USER /boot/config-$(uname -r)
CONFIG_INOTIFY_USER=y
如果输出('CONFIG_INOTIFY_USER=y'),那么你可以马上享受Inotify之旅了。

简单的文件变化通知样例:

好的开始是成功的一半,对于了解Inotify机制来说,让我们从使用inotifywait程序开始,它包含在 inotify-tools工具包中。假如我们打算监控/srv/test文件夹上的操作,只需执行:
% inotifywait -rme modify,attrib,move,close_write,create,delete,delete_self /srv/test
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
上述任务运行的同时,我们在另一个shell里依次执行以下操作:创建文件夹,然后在新文件夹下创建文件,接着删除新创建的文件:
% mkdir /srv/test/infoq
% echo TODO > /srv/test/infoq/article.txt
% rm /srv/test/infoq/article.txt
在运行inotifywait的shell中将会打印以下信息:
/srv/test/ CREATE,ISDIR infoq
/srv/test/infoq/ CREATE article.txt
/srv/test/infoq/ MODIFY article.txt
/srv/test/infoq/ CLOSE_WRITE,CLOSE article.txt
/srv/test/infoq/ DELETE article.txt
显而易见,只要有变化我们就会收到相关的通知。如果想了解关于Inotify提供的事件(如modify, atrrib等)的详细信息,请参考 inotifywatch的manpage。实际使用时,如果并不想监控某个大文件夹,那么就可以使用inotifywait的exclude选项。例如:我们要忽略文件夹/srv/test/large,那么就可以这样来建立监控:
% inotifywait --exclude '^/srv/test/(large|ignore)/' -rme modify,attrib,move,close_write,create,delete,delete_self /srv/test
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
上面的例子中,在exclude选项的匹配串中我们使用了 正则表达式,因为我们不想将名称中含有large或ignore的文件也排除掉。我们可以测试一下:
% echo test > /srv/test/action.txt
% echo test > /srv/test/large/no_action.txt
% echo test > /srv/test/ignore/no_action.txt
% echo test > /srv/test/large-name-but-action.txt
这里inotifywait应该只会报告'action.txt'和'large-name-but-action.txt'两个文件的变化,而忽略子文件夹'large'和'ignore'下的文件,结果也确实如此;
/srv/test/ CREATE action.txt
/srv/test/ MODIFY action.txt
/srv/test/ CLOSE_WRITE,CLOSE action.txt
/srv/test/ CREATE large-name-but-action.txt
/srv/test/ MODIFY large-name-but-action.txt
/srv/test/ CLOSE_WRITE,CLOSE large-name-but-action.txt
另外,通过使用-t选项我们还可以定义inotifywait的监控时间,既可以让它执行一段时间,也可以让它一直运行。 util-linux-ng的logger命令也可以实现此功能,不过得先把相关的消息事件发送到syslog,然后从syslog服务器再分析整合。

Inotifywatch - 使用inotify来统计文件系统访问信息

Inotify-tools中还有一个工具叫inotifywatch,它会先监听文件系统的消息事件,然后统计每个被监听文件或文件夹的消息事件,之后输出统计信息。比如我们想知道某个文件夹上有那些操作:
% inotifywatch -v -e access -e modify -t 120 -r ~/InfoQ
Establishing watches...
Setting up watch(es) on /home/mika/InfoQ
OK, /home/mika/InfoQ is now being watched.
Total of 58 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 120 seconds.
total  modify  filename
2      2       /home/mika/InfoQ/inotify/
很显然,这里我们监控的是~/InfoQ文件夹,并且可以看到/home/mika/InfoQ/inotify上发生了两个事件。方法虽简单,但却很有效。

Inotify的配置选项

使用Inotify时,要特别注意内核中关于它的两个配置。首先/proc/sys/fs/inotify/max_user_instances 规定了每个用户所能创建的Inotify实例的上限;其次/proc/sys/fs/inotify/max_user_watches规定了每个 Inotify实例最多能关联几个监控(watch)。你可以很容易地试验在运行过程中达到上限,如:
% inotifywait -r /
Setting up watches.  Beware: since -r was given, this may take a while!
Failed to watch /; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via `/proc/sys/fs/inotify/max_user_watches'.
如果要改变这些配置,只要向相应的文件写入新值即可,如下所示:
# cat /proc/sys/fs/inotify/max_user_watches
8192
# echo 16000 > /proc/sys/fs/inotify/max_user_watches
# cat /proc/sys/fs/inotify/max_user_watches
16000

使用Inotify的一些工具

近一段时间出现了很多基于Inotify的超炫的工具,如 incron, 它是一个类似于cron的守护进程(daemon),传统的cron守护进程都是在规定的某个时间段内执行,而incron由于使用了Inotify,可 以由事件触发执行。同时incron的安装简单而直观,比如在debian上,首先在/etc/incron.allow中添加使用incron的用户 (debian默认不允许用户使用incron,因为如果incron使用不慎的话,例如形成死循环,则会导致系统宕机): 
# echo username > /etc/incron.allow
然后调用”incrontab -e“, 在弹出的编辑器中插入我们自己的规则,例如下面的这条简单的规则,文件一变化incron就会发邮件通知我们:
/srv/test/ IN_CLOSE_WRITE mail -s "$@/$#\n" root
从现在开始,一旦/src/test文件夹中的文件被修改,就会发送一封邮件。但是注意 不要让incron监控整个子目录树,因为Inotify只关注inodes,而不在乎是文件还是文件夹,所以基于Inotify的软件都需要自己来处理/预防递归问题。关于incontab详细使用,请参考incrontab的manpage。
如果你还要处理incoming文件夹,那么你可能需要 inoticoming。 当有文件进入incoming文件夹时Inoticoming就会执行某些动作,从而可以用inoticoming来管理debian的软件仓库(例如软 件仓库中一旦有上传源码包或是新添加的二进制包就立刻自动进行编译),另外,还可以用它来监控系统是否有新上传文件,如果有就发送通知。类似的工具还有 (它们都各有专长): inosync(基于消息通知机制的文件夹同步服务), iwatch(基于Inotify的程序,对文件系统进行实时监控),以及 lsyncd(一个守护进程(daemon),使用rsync同步本地文件夹)。
Inotify甚至对传统的Unix工具也进行了改进,例如tail。使用 inotail,同时加上-f选项,就可以取代每秒轮询文件的做法。此外,GNU 的coreutils从版本7.5开始也支持Inotify了,我们可以运行下面的命令来确认:
# strace -e inotify_init,inotify_add_watch tail -f ~log/syslog
[...]
inotify_init()                          = 4
inotify_add_watch(4, "/var/log/syslog", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
从现在开始,通过轮询来确实文件是否需要重新读取的方法应该作为古董了。

在脚本中使用Inotify

Inotify机制并不局限于工具,在脚本语言中也完全可以享受Inotify的乐趣,如Python中可以使用 pyinotify和 inotifyx,Perl中有 Filesys-Notify-Simple和 Linux-Inotify2,Inotify的Ruby版有 ruby-inotifyrb-inoty和 fssm。

总结

综上所述,Inotify为Linux提供了一套高效监控和跟踪文件变化的机制,它可以实时地处理、调试以及监控文件变化,而轮询是一种延迟机制。 对于系统管理员,关于实现事件驱动的服务如系统备份,构建服务以及基于文件操作的程序调试等,Inotify无疑提供了强大的支持

分享到: sina.jpg tec.jpg

转载于:https://blog.51cto.com/dadloveu/845730

备份方法scp rsync,inotifywait相关推荐

  1. centos linux 系统日常管理4 scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法 第十七节课...

    centos linux 系统日常管理4  scp,rsync,md5sum,sha1sum,strace ,find Rsync 常见错误及解决方法  第十七节课 rsync可以增量同步,scp不行 ...

  2. linux 文件夹同步备份软件下载,rsync从linux到linux的文件同步备份方法_rsync在linux下同步备份教程_飞翔教程...

    一.环境 须要备份文件的服务器(服务器端):192.168.1.201 (RHEL 5) 接收备份文件的服务器(客户端):192.168.1.202 (CENTOS 5) 二.安装配置 1.服务器端的 ...

  3. linux下不同服务器间数据传输(rcp,scp,rsync,ftp,sftp,lftp,wget,curl)

    因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结.主要是rcp,scp,rsync,ftp,sftp,lftp, ...

  4. 如何备份mysql_史上最全的MYSQL备份方法

    本人曾经 用过的备份方式有:mysqldump.mysqlhotcopy.BACKUP TABLE .SELECT INTO OUTFILE,又或者备份二进制日志(binlog),还可以是直接拷贝数据 ...

  5. 【MongoDB】MongoDB备份方法

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB备份方法 On this page Back Up with MongoDB Cloud Manager or ...

  6. linux 上传网页文件大小,Linux:上传未完成的文件 – 文件大小检查(scp / rsync)

    我通常最终会遇到以下情况:例如,我有一个来自相机的650 MB MPEG-2 .avi视频文件.然后,我使用ffmpeg2theora将其转换为Theora .ogv视频文件,比如说大小为150 MB ...

  7. 云计算学习历程之-备份服务(rsync)上

    rsync介绍 rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步, 支持增量传输(只同步变化的 ...

  8. oracle数据库备份方法主要有哪几种,Oracle数据库备份方法有哪三种?

    Oracle数据库的备份方法很多,无论使用那种备份方法,备份的目的都是为了在出现故障后能够以尽可能小的时间和代价恢复系统.比如使用export实用程序导出数据库对象.使用Oracle备份数据库.使用O ...

  9. 基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题

    基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题 参考文章: (1)基于PLSQL的数据库备份方法及如何解决导出clob和blob类型数据报错的问题 (2)https: ...

最新文章

  1. OpenCV(项目)车牌识别2 -- 车牌字符分割(直方图)
  2. 手机应用:非功能需求 Check List
  3. 已解决Cause: java.sql.SQLException: Incorrect string value: ‘\\xF0\\x9F\\x8C\\xB8 \\xE5...‘报错
  4. WPF wpf scrollviewer 触屏滚动 窗体弹跳
  5. 如何用c 语言编写阶乘程序,求10000的阶乘(c语言代码实现)
  6. Android:简易单词本(三)
  7. java 命名管道_Java中命名管道的并发读/写(在Windows上)
  8. atitit.Oracle 9 10 11 12新特性attilax总结
  9. jvmti_JVMTI标记如何影响GC暂停
  10. imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例
  11. 【消息果留言板 v1.2】支持回复邮件提醒+页面pc端宽度调整+时间友好显示
  12. 【详细说明】nginx反向代理wss websocket
  13. 北京涛思数据获得 Pre A 轮融资,专注时序空间大数据领域
  14. rpcbind 、nfs无法启动问题
  15. 单片机74LS164C语言例子,74ls164单片机编程汇总(跑马灯/驱动数码管)
  16. MIL自动化单元测试
  17. Mysql安装步骤:
  18. Numpy 用 npy/npz 文件保存与载入数据
  19. 计算机报名上传图片需要flash,公务员报名上传照片时需要的flash控件是什么
  20. 渗透测试抓包工具-wireshark

热门文章

  1. matlab 7.0 完整版 iso安装好后能不能删除原件(删除后对使用matlab有没有影响)
  2. 树莓派-环境设置和交叉编译
  3. js回调函数(函数嵌套)
  4. 45岁程序员精通各种技术体系,竟然连个面试机会都没有?
  5. weka使用mysql数据_Weka访问MySql数据库
  6. 淘宝商品详情接口 淘宝商品库存接口 淘宝商品销量接口 淘宝商品sku信息接口 淘宝商品优惠价接口
  7. 测试分析--精准分析
  8. AndroidManifest.xml权限设置
  9. jar包启动基础命令
  10. linux中pwd命令详解,linux中的pwd命令的详细解释