## 使用Inotify+rsync同步數據
Inotify 一種強大的、細粒度的、異步文件系統監控機制,它滿足各種各樣的文件監控需要,可以監控文件系統的訪問屬性、讀寫屬性、權限屬性、刪除創建、移動等操作,也就是可以監控文件發生的一切變化。
inotify-tools 是一個C庫和一組命令行的工作,提供Linux下inotify的簡單接口。inotify-tools安裝后會得到inotifywait和inotifywatch這兩條命令:
* inotifywait命令可以用來收集有關文件訪問信息,Linux發行版一般沒有包括這個命令,需要安裝inotify-tools,這個命令還需要將inotify支持編譯入Linux內核,好在大多數Linux發行版都在內核中啟用了inotify。
* inotifywatch命令用于收集關于被監視的文件系統的統計數據,包括每個 inotify 事件發生多少次。
### 在CentOS下安裝inotifywait
~~~
#yum search inotify-tools
#yum info inotify-tools
sudo yum install inotify-tools
~~~
> MacOS下可以使用fswatch替代。fswatch是蘋果內置軟件,也可以在其他平臺上安裝。
### 配置腳本
~~~
#!/usr/bin/env bash
# 記錄進程號,可使用 ps -ef |grep notify.sh 查看
LOCK_NAME="/var/run/notify.pid"
# 本地待同步的目錄
SOURCE="/www/vhost"
# 目標服務器及目錄
TARGET="root@<ip_address>:/www/"
# 排除的目錄
EXCLUDE="cache"
# 遠程登錄命令
SSH="ssh -p 22"
# 日志
LOG="/var/log/notify_update_"
# 設置禁止重定向覆蓋 set -o noclobber ,即不能使用 > ,但可以使用 >>
# 設置恢復重定向覆蓋 set +o noclobber ,即職能使用 >> 和 >|
# 2> 標準錯誤(stderr)
# 1> 標準輸出(stdout)
# &> 同時輸出到 stdout 和 stderr
# /dev/null 位桶(bit bucket)或黑洞
# true: 0,false: 1。
# $? 退出碼
if (set -o noclobber; echo "$$" > "$LOCK_NAME") 2> /dev/null; then
# trap command signal
# INT 中斷進程 CTRL+C
# TERM 軟件終止信號
# 全部信號列表:trap -l
# 非正常退出時,自動刪除進程文件
trap 'rm -f "$LOCK_NAME"; exit $?' INT TERM EXIT
# yum install inotifywait
# -m | --monitor 持續監聽
# -r | --recursive 遞歸子目錄
# -e | --event <eventl> 指定要監聽的事件,多個事件用逗號隔開
# 文件有變動的事件:create/delete/move/attrib/close_write
inotifywait -mr \
# 指定輸出的時間格式,賦給 %T
--timefmt '%Y-%m-%d %H:%M' \
# 設置打印格式%T時間;%w觸發事件文件所在絕對路徑;%f觸發事件文件名稱;%e觸發的事件名稱;
--format '%T %w%f %e' \
-e create,move,close_write,delete,attrib $SOURCE \
--exclude $EXCLUDE | while read date time file event; do
# 當前日期,用于日志文件名
today=`date +%Y-%m-%d`
# 遍歷事件
case $event in
# 立即更新
MOVED_TO,ISDIR|MOVED_TO | CLOSE_WRITE,CLOSE)
# 如果同步未完成,忽略本次同步
ps aux | grep [r]sync
if [ $? -ne 0 ]; then
# 同步前計時器
t1=`date +%s`
# 文件同步
rsync -a --delete --numeric-ids -e $SSH $SOURCE $TARGET &
# 同步后計時器
t2=`date +%s`
# 計算文件更新完成的時間差
dt=$(($t2 - $t1))
# 寫日志
echo "[${date} ${time}] UPDATE ${file} ${dt}" >> $LOG_${today}.txt
fi
;;
# 目錄和文件的刪除,可暫不更新
DELETE,ISDIR | DELETE)
echo "[${date} ${time}] UPDATE ${file} ${dt}" >> $LOG_${today}.txt
;;
# 創建目錄,修改文件和目錄的屬性,可暫不更新
CREATE,ISDIR | ATTRIB,ISDIR | ATTRIB)
;;
esac
done
# 清除進程文件
rm -f $LOCK_NAME
#取消信號鎖定
trap - INT TERM EXIT
else
# 寫進程文件失敗意味著程序在運行中,或者為正常關閉
echo "The application is running, lock file name is $LOCK_NAME."
exit 1
fi
~~~
由于 fswatch 具有跨平臺的優勢,下面給出一個同步化示例。
~~~
#!/usr/bin/env bash
## 保持源目錄 LOCAL_DIR 和 目標目錄 REMOTE_DIR 同步
## 源目錄
LOCAL_DIR=/usr/local/var/www/project
## 目標目錄
REMOTE_DIR=/home/www/project
# pull
#rsync -avz --numeric-ids --exclude-from 'rsync_pull.txt' -e 'ssh -p 2222' pat@1.2.3.4:/home/www/ /usr/local/var/www/
# push
fswatch -e "runtime" -e "temp" -d $LOCAL_DIR | while read LOCAL_FILE
do
## 構造目標文件(包括文件夾)
REMOTE_FILE="${REMOTE_DIR}/${LOCAL_FILE##$LOCAL_DIR/}"
SOURCE=$(dirname $LOCAL_FILE)/
TARGET=$(dirname $REMOTE_FILE)/
echo $SOURCE >> ./rsync.log 2>&1
#echo $TARGET
rsync \
-P \
-S \
--delete --delete-after \
--exclude-from 'rsync_push.txt' \
-avz -e 'ssh -p 2222' \
$SOURCE \
pat@1.2.3.4:$TARGET
done
~~~
- 搭建ThinkPHP6的開發環境
- 配置ThinkPHP6
- 必要的基礎知識(basic)
- MVC開發模式
- 控制器(controller)
- 數據庫(database)
- 模型(model)
- 模型關聯(relation)
- 視圖(view)
- Session
- Cookie
- 緩存(cache)
- 上傳(upload)
- 驗證器(validate)
- 驗證碼(captcha)
- 命令行(command)
- 服務器部署(deploy)
- 數據備份(backup)
- 數據同步(synchronization)
- 訂閱服務(subscribe)
- PHP 易混淆知識點
- 助手函數
- MySQL規范
- Redis 規范
- office插件 phpoffice
- 拼音插件 pinyin
- 日期插件 datetime
- 消息插件 amqp
- 產品部署環境的搭建
- PDF 等雜項處理
- 文件上傳
- 常用擴展
- flc/dysms
- 使用示例 ①
- 使用示例 ②
- qiniu/php-sdk
- 簡介
- 使用示例
- 使用示例 2 ②
- liliuwei/thinkphp-jump
- 擴展介紹
- 下載擴展
- 使用方法
- topthink/think-captcha
- 安裝擴展
- 驗證碼顯示
- 更換驗證碼
- 驗證碼校驗
- 驗證碼配置
- 自定義驗證碼
- phpoffice/phpspreadsheet
- 數據寫入表格
- 讀取表格數據
- topthink/think-queue
- 安裝
- 自定義函數
- 任務類
- 帶有日志的任務類