目录
五、编写 rsync 结合 inotify 实现文件实时同步脚本
角色 | 系统 | ip | 主机名 |
服务端 | Ubuntu 20.4 | 192.19.0.171 |
bus |
客户端 | Ubuntu 20.4 | 172.19.0.170 | web |
一、编译安装inotify
在客户端安装inotify,即被监控端安装:
root@jt-test-web:~# apt install -y make gcc build-essential
root@jt-test-web:~# wget js.funet8.com/centos_software/inotify-tools-3.14.tar.gz
root@jt-test-web:~# tar -zxvf inotify-tools-3.14.tar.gz
root@jt-test-web:~# cd inotify-tools-3.14/
root@jt-test-web:~/inotify-tools-3.14# ./configure
root@jt-test-web:~/inotify-tools-3.14# make && make install
二、测试
安装inotify-tools后,当我们使用 inotifywait -rm /root/
来监控文件夹时报错:inotifywait: error while loading shared libraries【inotifywait:加载共享库时出错】
解决办法:
1.首先进入/usr/local/lib/ 目录查看是否有这个文件libinotifytools.so.0:
2.将目标文件链接(link)到核心库lib 和lib64中:
root@jt-test-web:/usr/local/lib# ln -sv /usr/local/lib/libinotify* /usr/lib/
root@jt-test-web:/usr/local/lib# ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0
3.输入inotifywait -rm /root/,另开一个相同终端在root目录下新建一个文件,即可看到监控效果。
三、inotifywait 参数详解
inotifywait 选项:
-r:递归,对目录中的子目录中的文件做监控
-q:仅仅打印少量信息(仅仅打印监控的事件)
-m:一直处于监控状态(默认在前台进行监控)
-d:以守护进程的方式来运行(运行在后台)
-o file:将监控到的时间输出到一个文件中(默认是输出到标准输出)
-s:将错误信息输出到系统日志中(默认是将错误信息输出到标准输出)
–excludei:忽略文件的大小写
-e <event>:指定要监控的事件
access:访问事件
modify:编辑事件
attrib:修改文件属性事件(修改文件的元数据)
close_write:当文件从写模式关闭的时候,会触发该事件
close_nowrite:当文件从只读模式下关闭的时候,会触发该事件
close:无论以什么方式打开文件,在关闭文件的时候,都会触发该事件
open:当文件被打开的是,就会触发该事件
moved_to:当一个文件被移动到监控目录下,就会触发该事件
moved_from:当一个文件从监控目录下移走的时候,就会触发该事件
moved_self:在监控目录下执行移动操作,就会触发该事件
move:主要发生了文件的移动,就会触发该事件
create:创建文件的事件
delete:删除文件的事件
–timefmt <fmt>:指定输出发生这个事件的时间点的显示格式
–format <fmt>:指定的当发生事件以后所输出的信息,以及输出的个数
%f:输出发生事件的文件名
%w:输出发生事件的文件所在的目录的绝对路径
%e:输出发生事件的名称(如果有多个事件,多个事件用空格分隔)
%Xe:输出发生事件的名称(如果有多个事件,多个事件用x分隔)
%T:输出发生事件的时间(时间的格式由 –timefmt <fmt>)
四、手动方式监控目录
在root目录下面创建一个text目录,监控text目录:
root@jt-test-web:~# inotifywait -mrq --timefmt "%F %T" --format '%T %w%f %e' -e create,delete,modify /root/text/
在text目录下创建文件,效果如下:
五、编写 rsync 结合 inotify 实现文件实时同步脚本
1.编写脚本
root@jt-test-web:~# vim /etc/inotify.sh
#!/bin/bash
# inotify
iorder="inotifywait"
events="create,delete,modify,attrib,move"
ioptions="-mrq"
ipath="/root/text/"
# rsync
rhost="172.19.0.171"
vuser="keymantech"
secfile="/etc/rsync-client.passwd"
roptions="-az"
modName="fbi_back"
$iorder $ioptions --timefmt "%F %T" --format '%T %w%f %e' -e $events $ipath | while read files
do
rsync $roptions --delete $ipath $vuser@$rhost::$modName --password-file=$secfile
echo "${files} was rsynced" >> /tmp/rsync.log 2>&1
done
2.检查脚本
root@jt-test-web:~# sh +x /etc/inotify.sh
切记等号两边不能有空格,不然会报错:
3.运行脚本
1.# 设置脚本后台运行:
nohup bash /etc/inotify.sh > /dev/null 2>&1 &
ps -ef | grep inotify
2.# 在text目录下进行创建、删除文件等操作
3.# 查看inotify生成的日志
tail /tmp/rsync.log
4.# 到服务端模块目录下查看文件是否同步
nohup命令:该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)
- /dev/null 表示空设备文件
- 0 表示stdin标准(键盘)输入
- 1 表示stdout标准(屏幕)输出
- 2 表示stderr标准错误(输出)
把标准出错重(2)定向到标准输出(1),然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。
最后一个& : 是让该命令在后台执行
4.设置开机自启
(1).打开 rc-local.service脚本内容,内容如下:
root@jt-test-web:~/text# vim /lib/systemd/system/rc-local.service
一般正常的启动文件主要分成三部分:
[Unit] 段: 启动顺序与依赖关系
[Service] 段: 启动行为,如何启动,启动类型
[Install] 段: 定义如何安装这个配置文件,即怎样做到开机启动
可以看出,/etc/rc.local 的启动顺序是在网络后面,但是显然它少了 Install 段,也就没有定义如何做到开机启动,所以显然这样配置是无效的。 因此我们就需要在后面帮他加上 [Install] 段:
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
root@jt-test-web:~/text# chmod 777 /lib/systemd/system/rc-local.service
(2).查看系统中有无 /etc/rc.local 这个文件,没有则自己创建一个。
root@jt-test-web:~/text# vim /etc/rc.local
# 添加下面信息:
#!/bin/sh
sh /etc/inotify.sh&
root@jt-test-web:~/text# chmod +x /etc/rc.local
如果在 /etc/rc.local 中添加的是 ./test.sh 这种类型的,要在末尾加上&, 不然重启ubuntu的时候会卡在启动界面进不去系统。
(3).创建软连接
systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接:
root@jt-test-web:~/text# ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/
大功告成!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74646.html