跳至内容

编译安装

在服务器上执行以下操作,在你的环境中,可能缺少一些依赖的包,通过: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

inotifywaitrsync 的组合

技巧

我们在 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 演示 02rsync 配置文件rsync 免密认证登录

作者:李天赐

贡献者:Steven Spencer, Ganna Zhyrnova