跳至内容

编译和安装

在服务器中执行以下操作。在您的环境中,一些依赖包可能缺失。使用以下命令安装它们: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 包?以及如何使用源代码编译和安装?

作者个人认为,远程数据传输是一个效率问题,尤其是在生产环境中,存在大量文件需要同步,单个文件特别大。此外,新版本将有一些错误修复和功能扩展,也许新版本的传输效率会更高,因此我建议通过源代码安装 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 中输入命令,按下 Enter 后窗口被锁定,表示正在监控

[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 [port-number]' /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