Inotify 是文件系统事件监控机制,计划包含在即将发布的 Linux 内核中作为 dnotify 的有效替代。dnotify 是较早内核支持的文件监控机制。Inotify一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。下面让我们一起学 习如何安装 inotify 和如何构建一个示例用户空间应用程序来响应文件系统事件。
stat
结构的缓存。该用户空间的 stat
结构缓存需要用来明确确定当接收到通知信号时目录发生了什么变化。当获得通知信号时,生成 stat
结构列表并与最新的状态相比较。显而易见,这种技术是不理想的。
select
和 poll
来监控设备。这允许有效的多路 I/O 和与 Glib 的 mainloop
的集成。相反,dnotify 所使用的信号常常使程序员头疼并且感觉不太优雅。
sotfware: inotify-tools-3.13.tar.gz
OS: ubuntu server 8.10
server1: 192.168.6.2
server2: 192.168.6.3
需求 server1 目录 /home/ludy/rsync 时时同步 server2 /home/ludy
安装步骤:
1.首先确认你的内核支持inotify,如果不支持对内核打补丁,一般情况内核在 2.6.3以上的都支持的。你可以确认下运行
ludy@server1:~$ls -l /proc/sys/fs/inotify/
总用量 0
-rw-r--r-- 1 ludy ludy 0 2008-12-16 14:40 max_queued_events
-rw-r--r-- 1 ludy ludy 0 2008-12-16 14:40 max_user_instances
-rw-r--r-- 1 root root 0 2008-12-16 09:07 max_user_watches
如果没有的话,呵呵安装inotify~
2.安装软件 inotify-tools-3.13.tar.gz
ludy@server1:~$ tar zxvf inotify-tools-3.13.tar.gz
ludy@server1:~$ cd inotify-tools-3.13
ludy@server1:~$ ./configure --prefix=/usr/local/inotify
ludy@server1:~$ make
ludy@server1:~$ make install
2.生成SSH KEY 让 server1 ssh访问 server2不需要密码~
ludy@server1:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ludy/.ssh/id_rsa): //输入回车
Enter passphrase (empty for no passphrase): //输入密码回车
Enter same passphrase again: //再输入确认后回车
Your identification has been saved in /home/ludy/.ssh/id_rsa.
Your public key has been saved in /home/ludy/.ssh/id_rsa.pub.
The key fingerprint is:
f1:35:4e:88:11:f1:c4:5a:7a:c9:2a:90:d3:5e:0a:6f ludy@ludy
The key's randomart p_w_picpath is:
+--[ RSA 2048]----+
| ++. |
| =o. |
| o o=o.+ |
| = . +o++ . |
| * oSo. . |
| E . |
| . . |
| |
| |
+-----------------+
3.然后把你用户目录下的 .ssh/id_rsa.pub 拷贝到 server2 的root下(我作的测试所以用的root,你最好不要用root很危险~)
ludy@server1:~/.ssh$ scp id_rsa.pub root@192.168.6.3:~/.ssh
拷贝过去后,进入server2 id_rsa.pub 把 名字改为 authorized_keys
root@server2:~/.ssh$ mv id_rsa.pub authorized_keys
root@server2:~/.ssh$ shown root:root authorized_keys //改变使用者 root
root@server2:~/.ssh$ chmod 600 authorized_keys //改变权限
4.在server1编写shell脚本
cat inosync.sh
#!/bin/sh
SRC=/home/ludy/rsync/
DST=root@192.168.6.3:/home/ludy
INWT=/usr/local/inotify/bin/inotifywait
RSYNC=/usr/bin/rsync
$INWT -mrq -e create,move,delete,modify $SRC | while read D E F;do
rsync -aHqzt $SRC $DST
done
我解释一下
$INWT -mrq -e create,move,delete,modify $SRC | while read D E F;do
rsync -aHqzt --delete $SRC $DST
-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件~
-e create,move,delete,modify
监听 创建 移动 删除 写入 事件
rsync -aHqzt $SRC $DST
-a 存档模式
-H 保存硬连接
-q 制止非错误信息
-z 压缩文件数据在传输
-t 维护修改时间
-delete 删除于多余文件
5.测试
ludy@server1:~$ ./inosync.sh &
ludy@server1:~$ cd rsync
ludy@server1:~/rsync$ touch asdfa
在server2 机器查看
root@server2:/home/ludy$ ls
asdfa
注意,可能第一次SSH 连接的时候需要输入一次密码,以后就不需要输入了~