1. rsync 介紹
rsync命令是一個(gè)遠(yuǎn)程數(shù)據(jù)同步工具噪馏,可通過(guò)LAN/WAN快速同步多臺(tái)主機(jī)間的文件。rsync使用所謂的“rsync算法”來(lái)使本地和遠(yuǎn)程兩個(gè)主機(jī)之間的文件達(dá)到同步瓶颠,這個(gè)算法只傳送兩個(gè)文件的不同部分,而不是每次都整份傳送粹淋,因此速度相當(dāng)快。 rsync是一個(gè)功能非常強(qiáng)大的工具屋匕,其命令也有很多功能特色選項(xiàng)。
2. rsync使用
【不帶任何選項(xiàng)】
rsync main.c machineB:/home/userB
1 只要目的端的文件內(nèi)容和源端不一樣过吻,就會(huì)觸發(fā)數(shù)據(jù)同步蔗衡,rsync會(huì)確保兩邊的文件內(nèi)容一樣。
2 但rsync不會(huì)同步文件的“modify time”绞惦,凡是有數(shù)據(jù)同步的文件,目的端的文件的“modify time”總是會(huì)被修改為最新時(shí)刻的時(shí)間樊展。
3 rsync不會(huì)太關(guān)注目的端文件的rwx權(quán)限堆生,如果目的端沒(méi)有此文件,那么權(quán)限會(huì)保持與源端一致淑仆;如果目的端有此文件,則權(quán)限不會(huì)隨著源端變更墩弯。
4 只要rsync有對(duì)源文件的讀權(quán)限,且對(duì)目標(biāo)路徑有寫權(quán)限渔工,rsync就能確保目的端文件同步到和源端一致桥温。
5 rsync只能以登陸目的端的賬號(hào)來(lái)創(chuàng)建文件,它沒(méi)有能力保持目的端文件的輸主和屬組和源端一致侵浸。(除非你使用root權(quán)限,才有資格要求屬主一致区端、屬組一致)
【-t選項(xiàng)】
rsync -t main.c machineB:/home/userB
1 使用-t選項(xiàng)后澳腹,rsync總會(huì)想著一件事杨何,那就是將源文件的“modify time”同步到目標(biāo)機(jī)器悔政。
2 帶有-t選項(xiàng)的rsync,會(huì)變得更聰明些槽地,它會(huì)在同步前先對(duì)比兩邊文件的時(shí)間戳和文件大小,如果一致捌蚊,則就認(rèn)為兩邊文件一樣近弟,對(duì)此文件就不再采取更新動(dòng)作了。
3 因?yàn)閞sync的聰明祷愉,也會(huì)反被聰明誤。如果目的端的文件的時(shí)間戳赴涵、大小和源端完全一致,但是內(nèi)容恰巧不一致時(shí)髓窜,rsync是發(fā)現(xiàn)不了的欺殿。這就是傳說(shuō)中的“坑”!
4 對(duì)于rsync自作聰明的情況程拭,解決辦法就是使用-I選項(xiàng)。
【-I選項(xiàng)】
rsync -I main.c machineB:/home/userB
1 -I選項(xiàng)會(huì)讓rsync變得很乖很老實(shí)哺壶,它會(huì)挨個(gè)文件去發(fā)起數(shù)據(jù)同步蜒谤。
2 -I選項(xiàng)可以確保數(shù)據(jù)的一致性鳍徽,代價(jià)便是速度上會(huì)變慢,因?yàn)槲覀兎艞壛恕皅uick check”策略阶祭。(quick check策略,就是先查看文件的時(shí)間戳和文件大小濒募,依次先排除一批認(rèn)為相同的文件)
3 無(wú)論情況如何,目的端的文件的modify time總會(huì)被更新到當(dāng)前時(shí)刻瑰剃。
【-v選項(xiàng)】
rsync -vI main.c machineB:/home/userB
//就是讓rsync輸出更多的信息,增加越多的v就可以獲取越多的日志信息
【多個(gè)選項(xiàng)】
rsync -rtv dist/ root@127.0.0.1:/usr/local/nginx/html/ops
//eg: 將本地代碼發(fā)布到遠(yuǎn)程服務(wù)器
//將同級(jí)文件夾dist下面的文件同步到遠(yuǎn)程服務(wù)的ops文件夾下面
e.g.: publish.sh文件
# 這是一個(gè)發(fā)布前端代碼的腳本 只要執(zhí)行 bash publish.sh test 發(fā)布代碼到測(cè)試服務(wù)器的對(duì)應(yīng)文件夾下面
#! /bin/bash
# 發(fā)布之前的打包
npm run build
# env變量保存 bash publish.sh xxx 第一個(gè)參數(shù)
env=$1
case $env in
test)
serverPath1=root@127.0.0.1:/usr/local/nginx/html/ops
;;
regress)
zipsTarget1=""
;;
prd)
serverPath1='正式環(huán)境地址'
;;
*)
echo "Need to specify env (test | regress | prd)"
exit -1;
;;
esac
# serverPath1 長(zhǎng)度不為0
if [ ! -z serverPath1 ] ; then
rsync -rtv dist/ $serverPath1 ;
else
echo rsync not excuted because there is no remote zipsTarget1 address for $env environment ;
fi
echo "Congratulation粤剧!publish success!"
3. rsync參數(shù)的具體解釋:
-v, --verbose 詳細(xì)模式輸出 -q, --quiet 精簡(jiǎn)輸出模式 -c, --checksum 打開(kāi)校驗(yàn)開(kāi)關(guān)抵恋,強(qiáng)制對(duì)文件傳輸進(jìn)行校驗(yàn) -a, --archive 歸檔模式,表示以遞歸方式傳輸文件弧关,并保持所有文件屬性唤锉,等于-rlptgoD -r, --recursive 對(duì)子目錄以遞歸模式處理 -R, --relative 使用相對(duì)路徑信息 -b, --backup 創(chuàng)建備份,也就是對(duì)于目的已經(jīng)存在有同樣的文件名時(shí)腌紧,將老的文件重新命名為~filename『排撸可以使用--suffix選項(xiàng)來(lái)指定不同的備份文件前綴。 --backup-dir 將備份文件(如~filename)存放在在目錄下猫胁。 -suffix=SUFFIX 定義備份文件前綴 -u, --update 僅僅進(jìn)行更新跛锌,也就是跳過(guò)所有已經(jīng)存在于DST,并且文件時(shí)間晚于要備份的文件髓帽。(不覆蓋更新的文件) -l, --links 保留軟鏈結(jié) -L, --copy-links 想對(duì)待常規(guī)文件一樣處理軟鏈結(jié) --copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹(shù)以外的鏈結(jié) --safe-links 忽略指向SRC路徑目錄樹(shù)以外的鏈結(jié) -H, --hard-links 保留硬鏈結(jié) -p, --perms 保持文件權(quán)限 -o, --owner 保持文件屬主信息 -g, --group 保持文件屬組信息 -D, --devices 保持設(shè)備文件信息 -t, --times 保持文件時(shí)間信息 -S, --sparse 對(duì)稀疏文件進(jìn)行特殊處理以節(jié)省DST的空間 -n, --dry-run現(xiàn)實(shí)哪些文件將被傳輸 -W, --whole-file 拷貝文件郑藏,不進(jìn)行增量檢測(cè) -x, --one-file-system 不要跨越文件系統(tǒng)邊界 -B, --block-size=SIZE 檢驗(yàn)算法使用的塊尺寸,默認(rèn)是700字節(jié) -e, --rsh=COMMAND 指定使用rsh必盖、ssh方式進(jìn)行數(shù)據(jù)同步 --rsync-path=PATH 指定遠(yuǎn)程服務(wù)器上的rsync命令所在路徑信息 -C, --cvs-exclude 使用和CVS一樣的方法自動(dòng)忽略文件俱饿,用來(lái)排除那些不希望傳輸?shù)奈募?--existing 僅僅更新那些已經(jīng)存在于DST的文件塌忽,而不備份那些新創(chuàng)建的文件 --delete 刪除那些DST中SRC沒(méi)有的文件 --delete-excluded 同樣刪除接收端那些被該選項(xiàng)指定排除的文件 --delete-after 傳輸結(jié)束以后再刪除 --ignore-errors 及時(shí)出現(xiàn)IO錯(cuò)誤也進(jìn)行刪除 --max-delete=NUM 最多刪除NUM個(gè)文件 --partial 保留那些因故沒(méi)有完全傳輸?shù)奈募允羌涌祀S后的再次傳輸 --force 強(qiáng)制刪除目錄枣购,即使不為空 --numeric-ids 不將數(shù)字的用戶和組ID匹配為用戶名和組名 --timeout=TIME IP超時(shí)時(shí)間装盯,單位為秒 -I, --ignore-times 不跳過(guò)那些有同樣的時(shí)間和長(zhǎng)度的文件 --size-only 當(dāng)決定是否要備份文件時(shí)薄霜,僅僅察看文件大小而不考慮文件時(shí)間 --modify-window=NUM 決定文件是否時(shí)間相同時(shí)使用的時(shí)間戳窗口,默認(rèn)為0 -T --temp-dir=DIR 在DIR中創(chuàng)建臨時(shí)文件 --compare-dest=DIR 同樣比較DIR中的文件來(lái)決定是否需要備份 -P 等同于 --partial --progress 顯示備份過(guò)程 -z, --compress 對(duì)備份的文件在傳輸時(shí)進(jìn)行壓縮處理 --exclude=PATTERN 指定排除不需要傳輸?shù)奈募J?--include=PATTERN 指定不排除而需要傳輸?shù)奈募J?--exclude-from=FILE 排除FILE中指定模式的文件 --include-from=FILE 不排除FILE指定模式匹配的文件 --version 打印版本信息 --address 綁定到特定的地址 --config=FILE 指定其他的配置文件澜掩,不使用默認(rèn)的rsyncd.conf文件 --port=PORT 指定其他的rsync服務(wù)端口 --blocking-io 對(duì)遠(yuǎn)程shell使用阻塞IO -stats 給出某些文件的傳輸狀態(tài) --progress 在傳輸時(shí)現(xiàn)實(shí)傳輸過(guò)程 --log-format=formAT 指定日志文件格式 --password-file=FILE 從FILE中得到密碼 --bwlimit=KBPS 限制I/O帶寬芹敌,KBytes per second -h, --help 顯示幫助信息 一般同步傳輸目錄都使用azv選項(xiàng).