天天看點

使用inotify-tools與rsync建構實時備份系統

使用inotifywait監控檔案變動

inotifywait是

inotify-tools

包中提供的一個工具,它使用

inotify

API 來監控檔案/目錄中的變動情況。

在archlinux上,我們可以使用下面指令來安裝

sudo pacman -S --noconfirm inotify-tools           

平時

inotifywait

會挂起在那裡,直到檔案/目錄發生了要引起關注的事件後,它會退出并輸出事件發生的場所、事件的名稱以及引起事件的檔案(當事件發生在目錄上時才會輸出).

inotifywait

最常用的選項有兩個,一個是

-r

一個是

-e

,其中:

-r
表示遞歸監控子目錄中檔案發生的事件
-e
指定要監控的事件清單。對于備份系統來說,隻需要監控 modify、create和delete三種事件就行了。

比如,我們運作

inotifywait -r -e modify,create,delete /tmp           

表示監控

/tmp

目錄及其子目錄中檔案修改、檔案建立和檔案删除三種事件。

這時程式一直在挂起狀态

[lujun9972@X61 ~]$ inotifywait -r -e modify,create,delete /tmp
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.           

這時在

/tmp

目錄下建立一個檔案

touch /tmp/newFile           

inotifywait

程序退出,并輸出如下資訊

/tmp/ CREATE newFile           

使用rsync同步變動

rsync是一款快速增量備份工具。它的具有以下幾個特點使得它很适合用作做備份的工具:

  • 增量備份,隻會傳輸修改過的内容
  • 可以在傳輸過程中實時解壓縮,減少帶寬消耗
  • 可以保持原來檔案的權限、事件、軟硬連結
  • 即支援本機複制,也支援遠端複制

rsync常用法為:

rsync -avz --delete  src/ foo:/data           

其中

-a
表示archive mode,即備份目錄下的所有内容(包括子目錄中的内容),并且保持軟連結、檔案屬性、檔案修改事件、檔案的所有者和宿主資訊不變,并且同步字元/塊裝置以及命名socket和fifo等特殊檔案。
-v
表示輸出備份的詳細資訊
-z
表示傳輸時進行壓縮
–delete
删除備份目的地裡src中沒有的檔案
src/
表示要備份的是src目錄下的所有内容,注意這裡最後的

/

不能去掉,否則會把src目錄本身備份過去
foo:/data
表示備份的目的地是foo主機下的

/data/

目錄

整合起來

接下來我們隻需要用個

while

死循環把兩個工具整合起來就行了,非常簡單

#!/bin/bash
if [[ $# -ne 2 ]];then
    cat<<EOF
Usage $(basename $0) source_dir [host:]dest_dir
EOF
    exit 0
fi
source_dir=$1
dest_dir=$2
while :
do
    inotifywait -r -e modify,create,delete ${source_dir} && rsync -avz ${source_dir}/ ${dest_dir} --delete
done           

這裡有必要說明的是,雖然用

inotifywait

能探測出檔案具體做了什麼改動,但實際上我們根本不需要知道具體的改變是什麼。

我們隻需要知道有所改變了,然後具體改變了什麼由

rsync

來自己處理就行了。

原文位址:

https://lujun9972.github.io/blog..