编译和安装¶
在服务器中执行以下操作。在您的环境中,一些依赖包可能缺失。使用以下命令安装它们: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
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 [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 演示 02,rsync 配置文件,rsync 免费秘密身份验证登录
作者:田倩丽
贡献者:Steven Spencer,Ganna Zhyrnova