日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

inotify用法简介及结合rsync实现主机间的文件实时同步

發(fā)布時間:2023/11/30 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 inotify用法简介及结合rsync实现主机间的文件实时同步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。