编译安装¶
在服务器上执行以下操作,在你的环境中,可能缺少一些依赖的包,通过:dnf -y install autoconf automake libtool
安装即可
[root@Rocky ~]# wget -c https://github.com/inotify-tools/inotify-tools/archive/refs/tags/3.21.9.6.tar.gz
[root@Rocky ~]# tar -zvxf 3.21.9.6.tar.gz -C /usr/local/src/
[root@Rocky ~]# cd /usr/local/src/inotify-tools-3.21.9.6/
[root@Rocky /usr/local/src/inotify-tools-3.21.9.6]# ./autogen.sh && \
./configure --prefix=/usr/local/inotify-tools && \
make && \
make install
...
[root@Rocky ~]# ls /usr/local/inotify-tools/bin/
inotifywait inotifywatch
追加环境变量 PATH,写入配置文件,并让其永久生效。
[root@Rocky ~]# vim /etc/profile
...
PATH=$PATH:/usr/local/inotify-tools/bin/
[root@Rocky ~]# . /etc/profile
为何不使用 EPEL 仓库的 inotify-tools 的 RPM 包?以及源码编译安装的方式?
作者个人认为,远程数据传输是一项效率工作,特别是在生产环境中,需要同步的文件数量庞大,且单个文件体积尤为巨大。另外,新版本会有一些 bug 修复和功能扩展,并且可能新版本的传输效率会有所提升,因此推荐源码编译安装 inotify-tools。当然,这只是作者个人建议,并非每位用户都必须遵循。
内核参数调整¶
可以根据生产环境的需求,调整内核参数,默认在 /proc/sys/fs/inotity/ 下有三个文件
[root@Rocky ~]# cd /proc/sys/fs/inotify/
[root@Rocky /proc/sys/fs/inotify]# cat max_queued_events ;cat max_user_instances ;cat max_user_watches
16384
128
28014
- max_queued_events-最大监控队列大小,默认 16384
- max_user_instances-最大监控实例数,默认 128
- max_user_watches-每个实例最大监控文件数,默认 8192
将一些参数及值写入 /etc/sysctl.conf,示例如下。然后执行 sysctl -p
使文件生效
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
相关命令¶
inotify-tools 工具类命令有两个,分别是
-
inotifywait: 用于连续监控,实时输出结果。一般和 rsync 增量备份工具配合使用。由于是文件系统监控,因此可以和脚本配合使用,具体的脚本编写我们后面介绍。
-
inotifywatch: 用于短暂监控,任务完成后输出结果。
inotifywait
主要有以下选项
-m means continuous monitoring
-r Recursive monitoring
-q Simplify output information
-e specifies the event type of monitoring data, multiple event types are separated by commas in English status
事件类型如下
事件类型 | 描述 |
---|---|
access | 访问文件或目录的内容 |
modify | 写入文件或目录的内容 |
attrib | 修改文件或目录的属性 |
close_write | 以可写模式打开后关闭文件或目录 |
close_nowrite | 以只读模式打开后关闭文件或目录 |
close | 无论读写模式,关闭文件或目录 |
open | 打开文件或目录 |
moved_to | 文件或目录被移入被监控的目录 |
moved_from | 文件或目录被移出被监控的目录 |
move | 有文件或目录被移入或移出被监控的目录 |
move_self | 被监控的文件或目录已被移动 |
create | 有文件或目录在被监控的目录中被创建 |
delete | 在被监控的目录中的文件或目录被删除 |
delete_self | 文件或目录已被删除 |
unmount | 包含文件或目录的文件系统被卸载 |
示例:[root@Rocky ~]# inotifywait -mrq -e create,delete /rsync/
inotifywait
命令演示¶
在第一个终端 pts/0 中输入命令,按下回车后窗口锁定,表明正在监控
[root@Rocky ~]# inotifywait -mrq -e create,delete /rsync/
在第二个终端 pts/1 中,进入 /rsync/ 目录,创建一文件。
[root@Rocky ~]# cd /rsync/
[root@Rocky /rsync]# touch inotify
回到第一个终端 pts/0,输出信息如下
[root@Rocky ~]# inotifywait -mrq -e create,delete /rsync/
/rsync/ CREATE inotify
inotifywait
与 rsync
的组合¶
技巧
我们在 Rocky Linux 8 服务器上操作,使用 SSH 协议进行演示。
SSH 协议的免密认证登录,请参考 rsync 免密认证登录 ,这里不再赘述。bash 脚本内容示例如下。你可以根据自己需求,在命令后面添加不同的选项,满足自己的需求,例如,你也可以在 rsync
命令后面添加 --delete
选项。
#!/bin/bash
a="/usr/local/inotify-tools/bin/inotifywait -mrq -e modify,move,create,delete /rsync/"
b="/usr/bin/rsync -avz /rsync/* testfedora@192.168.100.5:/home/testfedora/"
$a | while read directory event file
do
$b &>> /tmp/rsync.log
done
[root@Rocky ~]# chmod +x rsync_inotify.sh
[root@Rocky ~]# bash /root/rsync_inotify.sh &
技巧
使用 SSH 协议进行数据同步传输时,如果目标机器的 SSH 服务端口不是 22,你可以采用类似这样的方式—— b="/usr/bin/rsync -avz -e 'ssh -p [端口号]' /rsync/* testfedora@192.168.100.5:/home/testfedora/"
技巧
如果想让此脚本开机自启 [root@Rocky ~]# echo "bash /root/rsync_inotify.sh &" >> /etc/rc.local
[root@Rocky ~]# chmod +x /etc/rc.local
如果使用 rsync 协议进行同步,则需要对目标机器的 rsync 服务进行配置,请参考 rsync 演示 02、rsync 配置文件、rsync 免密认证登录
作者:李天赐
贡献者:Steven Spencer, Ganna Zhyrnova