编译安装¶
在服务器中执行以下操作, 在你的环境中,可能会缺少一些依赖的包, 使用以下方式安装它们: 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
[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 表示持续监控
-r 递归监控
-q 简化输出信息
-e 指定监控数据的事件类型,多个事件类型用英文状态的逗号隔开
事件类型如下:
事件类型 | 说明 |
---|---|
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脚本内容示例如下。 您可以根据需要,在命令的后面加上不同的选项来满足需求。 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 免密验证登录
Author: tianci li
Contributors: Steven Spencer, Ganna Zhyrnova