inotify用法简介及结合rsync实现主机间的文件实时同步
一、inotify簡介
?
inotify是Linux內(nèi)核2.6.13 (June 18, 2005)版本新增的一個子系統(tǒng)(API),它提供了一種監(jiān)控文件系統(tǒng)(基于inode的)事件的機(jī)制,可以監(jiān)控文件系統(tǒng)的變化如文件修改、新增、刪除等,并可以將相應(yīng)的事件通知給應(yīng)用程序。該機(jī)制由著名的桌面搜索引擎項目beagle引入用于替代此前具有類似功能但存在諸多缺陷的dnotify。
?
inotify既可以監(jiān)控文件,也可以監(jiān)控目錄。當(dāng)監(jiān)控目錄時,它可以同時監(jiān)控目錄及目錄中的各子目錄及文件的。此外,inotify 使用文件描述符作為接口,因而可以使用通常的文件I/O操作select、poll和epoll來監(jiān)視文件系統(tǒng)的變化。
?
inotify 可以監(jiān)視的文件系統(tǒng)常見事件包括:
IN_ACCESS:文件被訪問
IN_MODIFY:文件被修改
IN_ATTRIB,文件屬性被修改
IN_CLOSE_WRITE,以可寫方式打開的文件被關(guān)閉
IN_CLOSE_NOWRITE,以不可寫方式打開的文件被關(guān)閉
IN_OPEN,文件被打開
IN_MOVED_FROM,文件被移出監(jiān)控的目錄
IN_MOVED_TO,文件被移入監(jiān)控著的目錄
IN_CREATE,在監(jiān)控的目錄中新建文件或子目錄
IN_DELETE,文件或目錄被刪除
IN_DELETE_SELF,自刪除,即一個可執(zhí)行文件在執(zhí)行時刪除自己
IN_MOVE_SELF,自移動,即一個可執(zhí)行文件在執(zhí)行時移動自己
?
通過/proc接口中的如下參數(shù)設(shè)定inotify能夠使用的內(nèi)存大小:
1、/proc/sys/fs/inotify/max_queue_events
應(yīng)用程序調(diào)用inotify時需要初始化inotify實例,并時會為其設(shè)定一個事件隊列,此文件中的值則是用于設(shè)定此隊列長度的上限;超出此上限的事件將會被丟棄;
2、/proc/sys/fs/inotify/max_user_instances
此文件中的數(shù)值用于設(shè)定每個用戶ID(以ID標(biāo)識的用戶)可以創(chuàng)建的inotify實例數(shù)目的上限;
3、/proc/sys/fs/inotify/max_user_watches
此文件中的數(shù)值用于設(shè)定每個用戶ID可以監(jiān)控的文件或目錄數(shù)目上限;
?
?
二、inotify-tools
?
inotify是一個API,需要通過開發(fā)應(yīng)用程序進(jìn)行調(diào)用,對于大多數(shù)用戶來講這有著許多不便,inotify-tools的出現(xiàn)彌補了這一不足。inotify-tools是一套組件,它包括一個C庫和幾個命令行工具,這些命令行工具可用于通過命令行或腳本對某文件系統(tǒng)的事件進(jìn)行監(jiān)控。它由Rohan McGovern開發(fā),其項目網(wǎng)址為http://inotify-tools.sourceforge.net。
?
inotify-tools提供的兩個命令行工具:
inotifywait:通過inotify API等待被監(jiān)控文件上的相應(yīng)事件并返回監(jiān)控結(jié)果,默認(rèn)情況下,正常的結(jié)果返回至標(biāo)準(zhǔn)輸出,診斷類的信息則返回至標(biāo)準(zhǔn)錯誤輸出。它可以在監(jiān)控到對應(yīng)監(jiān)控對象上指定的事件后退出,也可以進(jìn)行持續(xù)性的監(jiān)控。
inotifywatch:通過inotify API收集被監(jiān)控文件或目錄的相關(guān)事件并輸出統(tǒng)計信息。
?
?
inotifywait命令使用簡介:
inotifywait尤其適用于在腳本中等待某事件的發(fā)生,并可基于特定的事件執(zhí)行相應(yīng)操作。如將其用于腳本中監(jiān)控某指定目錄中的文件上的修改、新建、刪除、屬性信息的改變,而后使用rsync命令將某事件對應(yīng)的文件同步至其它主機(jī)上。其常用選項如下:
-m, --monitor:inotifywait的默認(rèn)動作是在監(jiān)控至指定文件的特定事件發(fā)生一次后就退出了,而使用此選項則可實現(xiàn)持續(xù)性的監(jiān)控;
-r, --recursive:遞歸監(jiān)控指定目錄下的所有文件,包括新建的文件或子目錄;如果要監(jiān)控的目錄中文件數(shù)量巨大,則通常需要修改/proc/sys/fs/inotify/max_users_watchs內(nèi)核參數(shù),因為其默認(rèn)值為8192。
-e <event>, --event <event>:指定要監(jiān)控的特定事件,默認(rèn)是監(jiān)控所有的事件;此處<event>包括access, modify, attrib, close_write, close_nowirte, close, open, moved_to, moved_from, move, create, delete, delete_selt等;
--timefmt <fmt>:當(dāng)在--format選項中使用%T時,--timefrt選項則可以用來指定自定義的符合strftime規(guī)范的時間格式,此時間格式可用的格式符可以通過strftime的手冊頁獲取;--timefrt后常用的參數(shù)是'%d/%m/%y %H:%M';
--format <fmt>:自定義inotifywait的輸出格式,如--format '%T %w %f';常用的格式符如下:
? ? ? %w:顯示被監(jiān)控文件的文件名;
? ? ? %f:如果發(fā)生某事件的對象是目錄,則顯示被監(jiān)控目錄的名字;默認(rèn)顯示為空串;
? ? ? %T:使用--timefmt選項中自定義的時間格式;
?
例如,要監(jiān)控/tmp/test目錄及其內(nèi)部所有文件上發(fā)生的create,delete,modify,close_write事件,則使用如下命令:
# inotify -r --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e create,delete,modify,close_write /tmp/test
?
此命令在監(jiān)控到某文件上第一次事件后就會退出,如果想一直監(jiān)控,則需要為命令添加-m選項。
?
在很多場景中都會用到將某主機(jī)上的某目錄下的所有文件改變實時同步至另一主機(jī)上的指定位置,這也可以通過在腳本中使用inotifywait結(jié)合rsync命令來實現(xiàn),比如如下腳本:
?
#!/bin/bash
?
DESTHOST=172.16.100.6
DESTHOSTDIR=/www/htdocs/
SRCDIR=/www/htdocs/
?
inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' ?\
-e create,delete,modify,attrib ?$SRCDIR | while read DATE TIME DIR FILE; do
? ?$FILECHANGE=${DIR}${FILE}
?
? ?rsync -avze 'ssh' $SRCDIR root@${DESTHOST}:${DESTHOSTDIR} &>/dev/null && \
? ? ? echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/filesync.log
?
done
?
需要注意的是,此腳本中的rsync是通過ssh加密后進(jìn)行文件傳輸?shù)?#xff0c;因此需要事先配置好相應(yīng)的ssh能夠基于密鑰對用戶進(jìn)行認(rèn)證,以免每一次文件同步都需要用戶手動輸入密碼。
?
當(dāng)然,如果數(shù)據(jù)傳輸不需要加密,此處也可以通過在目錄主機(jī)的啟動rsyncd守護(hù)進(jìn)程來實現(xiàn)。
?
三、配置rsyncd+inotify實現(xiàn)文件實時同步:
?
本案例實現(xiàn)監(jiān)控原主機(jī)上指定目錄中的所有文件變化,并將變化實時同步至目標(biāo)主機(jī)的指定目錄中;所用主機(jī)及相關(guān)目錄如下:
源主機(jī):RHEL5.4(x86),172.16.100.1, 文件所在的目錄為/www/htdocs;
目標(biāo)主機(jī):RHEL5.4(x86),172.16.100.6, 文件所在的目錄為/www/htdocs;
?
1、設(shè)定目標(biāo)主機(jī)(本例為172.16.100.6)
?
本案例中采用基于rsync守護(hù)進(jìn)程的方式進(jìn)行數(shù)據(jù)同步,其數(shù)據(jù)傳輸過程是明文方式,因此只適用于在特定的場景中應(yīng)用。
?
1)安裝相關(guān)軟件:
目標(biāo)主機(jī)是接收別的主機(jī)發(fā)送來的文件的服務(wù)器,因此,其rsync需要以守護(hù)進(jìn)程的方式工作。rsync服務(wù)通常基于超級守護(hù)進(jìn)程xinetd管理的方式來實現(xiàn),因此需要事先安裝rysnc和xinetd:
# yum -y install rsync xinetd
?
2)為rsync提供配置文件/etc/rsyncd.conf,內(nèi)容類似如下內(nèi)容:
# Section 1: Global settings
uid = nobody
gid = nobody
use chroot = no
max connections = 3
strict modes = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# Section 2:Directory to be synced
[htdocs]
path = /www/htdocs
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.0.0/16
hosts deny = *
list = false
uid = root
gid = root
auth users = wwwuser
secrets file = /etc/rsync.passwd
?
其中的相關(guān)指令及其說明可以通過rsyncd.conf的手冊而獲取。而其訪問控制功能也可基于xinetd進(jìn)行,具體方法請參照xinetd.conf的手冊頁。
?
3)提供secrets file所指定的口令文件/etc/rsync.passwd,其內(nèi)容類似如下:
htdocsuser:passwOrdForhtdOcs
?
其中冒號前的是用戶名,冒號后的是對應(yīng)用戶的密碼。此文件不能為其他任意用戶可訪問,因此可用如下命令修改:
# chmod 600 ?/etc/rsync.passwd
?
4)配置服務(wù)可以開機(jī)啟動:
# chkconfig rsync on
# chkconfig xinetd on
# service xinetd start
?
默認(rèn)情況下,rsyncd監(jiān)聽的端口為873/TCP,這可以通過如下命令查看:
# netstat -tnlp | grep ":873"
tcp ? ? ? ?0 ? ? ?0 0.0.0.0:873 ? ? ? ? ? ? ? ? 0.0.0.0:* ? ? ? ? ? ? ? ? ? LISTEN ? ? ?3653/xinetd
?
2、設(shè)定源主機(jī)
?
1)安裝相關(guān)軟件
源主機(jī)需要實時監(jiān)控指定目錄中的所有文件上與文件改變相關(guān)的事件,并在事件發(fā)生時將改變的數(shù)據(jù)同步至目錄主機(jī),因此,源主機(jī)上需要確保內(nèi)核支持inotify,并安裝inotify-tools和rsync。
?
rsync的安裝參照目標(biāo)主機(jī)的中的方式進(jìn)行即可。
?
inotify-tools的安裝可以基于源碼編譯的方式進(jìn)行,也可以通過安裝其rpm進(jìn)行。
源碼下載地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
rpm包下載頁面:http://rpm.pbone.net/index.php3/stat/4/idpl/15265939/dir/redhat_el_5/com/inotify-tools-3.14-1.el5.i386.rpm.html
?
這里以編譯源代碼的方式演示安裝過程:
# tar xf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure
# make
# make install
# echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig
?
2)為源主機(jī)的rsync提供通過htdocsuser用戶同步文件至目標(biāo)主機(jī)的口令文件
# echo 'passwOrdForhtdOcs' > /etc/rsync.passwd
# chmod 600 /etc/rsync.passwd
?
注意,對于RHEL5.4自帶的2.6.8版本的rsync來說,其客戶端(即此處的源主機(jī)上的rsync)的口令文件中只能保存用戶的口令,而不能類似目標(biāo)主機(jī)上可同時指定用戶名。
?
3)建立腳本/root/bin/htdocsync.sh,通過inotifywait監(jiān)控目標(biāo)文件上的相應(yīng)事件,并在事件觸發(fā)時啟動同步過程:
#!/bin/bash
#
DESTHOST=172.16.100.6
DESTHOSTDIR=/www/htdocs/
SRCDIR=/www/htdocs/
?
inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR | ?while read DATE TIME DIR FILE; do
?
? ? ? ?FILECHANGE=${DIR}${FILE}
?
? ? ? ?rsync -avz --password-file=/etc/rsync.passwd $SRCDIR htdocsuser@${DESTHOST}::htdocs &>/dev/null && \
? ? ? ?echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/websync.log
done
?
而后給此腳本執(zhí)行權(quán)限,并執(zhí)行即可:
# chmod u+x /root/bin/htdocsync.sh
# /root/bin/htdocsync.sh &
?
如果想讓此功能可以在開機(jī)時自動啟動,則可以通過如下方式進(jìn)行:
# echo '/root/bin/htdocsync.sh &' >> /etc/rc.d/rc.local
?
補充說明:如果您期望將源主機(jī)上的數(shù)據(jù)同步至多臺目標(biāo)主機(jī),對每個目標(biāo)主機(jī)均類似上面的目標(biāo)主機(jī)的設(shè)定方法進(jìn)行設(shè)定即可。
轉(zhuǎn)載于:https://www.cnblogs.com/wjoyxt/p/4440968.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的inotify用法简介及结合rsync实现主机间的文件实时同步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用labview读取一副位图,并进行B
- 下一篇: 梯度下降法分析