#!/bin/bash
src
=
/
data
/
# 須要同步的源路徑
des
=
data
# 目標服務器上 rsync --daemon 發佈的名稱,rsync --daemon這裏就不作介紹了,網上搜一下,比較簡單。
rsync_passwd_file
=
/
etc
/
rsyncd
.
passwd
# rsync驗證的密碼文件
ip1
=
192.168.0.18
# 目標服務器1
ip2
=
192.168.0.19
# 目標服務器2
user
=
root
# rsync --daemon定義的驗證用戶名
cd
$
{
src
}
# 此方法中,因爲rsync同步的特性,這裏必需要先cd到源目錄,inotify再監聽 ./ 才能rsync同步後目錄結構一致,有興趣的同窗能夠進行各類嘗試觀看其效果
/
usr
/
local
/
bin
/
inotifywait
-
mrq
--
format
'%Xe %w%f'
-
e
modify
,
create
,
delete
,
attrib
,
close_write
,
move
.
/
|
while
read
file
# 把監控到有發生更改的"文件路徑列表"循環
do
INO_EVENT
=
$
(
echo
$
file
|
awk
'{print $1}'
)
# 把inotify輸出切割 把事件類型部分賦值給INO_EVENT
INO_FILE
=
$
(
echo
$
file
|
awk
'{print $2}'
)
# 把inotify輸出切割 把文件路徑部分賦值給INO_FILE
echo
"-------------------------------$(date)------------------------------------"
echo
$
file
#增長、修改、寫入完成、移動進事件
#增、改放在同一個判斷,由於他們都確定是針對文件的操做,即便是新建目錄,要同步的也只是一個空目錄,不會影響速度。
if
[
[
$
INO_EVENT
=
~
'CREATE'
]
]
||
[
[
$
INO_EVENT
=
~
'MODIFY'
]
]
||
[
[
$
INO_EVENT
=
~
'CLOSE_WRITE'
]
]
||
[
[
$
INO_EVENT
=
~
'MOVED_TO'
]
]
# 判斷事件類型
then
echo
'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync
-
avzcR
--
password
-
file
=
$
{
rsync_passwd_file
}
$
(
dirname
$
{
INO_FILE
}
)
$
{
user
}
@
$
{
ip1
}
::
$
{
des
}
&&
# INO_FILE變量表明路徑哦 -c校驗文件內容
rsync
-
avzcR
--
password
-
file
=
$
{
rsync_passwd_file
}
$
(
dirname
$
{
INO_FILE
}
)
$
{
user
}
@
$
{
ip2
}
::
$
{
des
}
#仔細看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})變量 即每次只針對性的同步發生改變的文件的目錄(只同步目標文件的方法在生產環境的某些極端環境下會漏文件 如今能夠在不漏文件下也有不錯的速度 作到平衡) 而後用-R參數把源的目錄結構遞歸到目標後面 保證目錄結構一致性
fi
#刪除、移動出事件
if
[
[
$
INO_EVENT
=
~
'DELETE'
]
]
||
[
[
$
INO_EVENT
=
~
'MOVED_FROM'
]
]
then
echo
'DELETE or MOVED_FROM'
rsync
-
avzR
--
delete
--
password
-
file
=
$
{
rsync_passwd_file
}
$
(
dirname
$
{
INO_FILE
}
)
$
{
user
}
@
$
{
ip1
}
::
$
{
des
}
&&
rsync
-
avzR
--
delete
--
password
-
file
=
$
{
rsync_passwd_file
}
$
(
dirname
$
{
INO_FILE
}
)
$
{
user
}
@
$
{
ip2
}
::
$
{
des
}
#看rsync命令 若是直接同步已刪除的路徑${INO_FILE}會報no such or directory錯誤 因此這裏同步的源是被刪文件或目錄的上一級路徑,並加上--delete來刪除目標上有而源中沒有的文件,這裏不能作到指定文件刪除,若是刪除的路徑越靠近根,則同步的目錄月多,同步刪除的操做就越花時間。這裏有更好方法的同窗,歡迎交流。
fi
#修改屬性事件 指 touch chgrp chmod chown等操做
if
[
[
$
INO_EVENT
=
~
'ATTRIB'
]
]
then
echo
'ATTRIB'
if
[
!
-
d
"$INO_FILE"
]
# 若是修改屬性的是目錄 則不一樣步,由於同步目錄會發生遞歸掃描,等此目錄下的文件發生同步時,rsync會順帶更新此目錄。
then
rsync
-
avzcR
--
password
-
file
=
$
{
rsync_passwd_file
}
$
(
dirname
$
{
INO_FILE
}
)
$
{
user
}
@
$
{
ip1
}
::
$
{
des
}
&&
rsync
-
avzcR
--
password
-
file
=
$
{
rsync_passwd_file
}
$
(
dirname
$
{
INO_FILE
}
)
$
{
user
}
@
$
{
ip2
}
::
$
{
des
}
fi
fi
done