电竞比分网-中国电竞赛事及体育赛事平台

分享

Ubuntu通過(guò)rsync實(shí)現(xiàn)定時(shí)同步文件夾

 Allen 圖書館 2024-01-12 發(fā)布于上海

前言:

最近要整理多個(gè)服務(wù)器的代碼,代碼備份同步的事兒實(shí)在太惡心了。

因此想著能不能直接搞一個(gè)自動(dòng)定時(shí)同步的腳本

搜了一下,發(fā)現(xiàn)了Linux自帶一個(gè)同步的命令:
Ubuntu 文件同步工具 rsync

這玩意兒算是第一個(gè)見,看來(lái)我還是得抽時(shí)間過(guò)一遍鳥叔的Linux私房菜了,至少要知道Linux本身可以有哪些功能,提高效率。

rsync的常見操作:

cp和scp是ubuntu中文件拷貝常用的兩個(gè)命令,一般在同一臺(tái)服務(wù)器上我們是用cp命令,跨服務(wù)時(shí)使用過(guò)scp命令,但是如果做文件同步的話,rsync要比上述兩個(gè)命令更好用一些,跨不跨服務(wù)器都是如此。

因?yàn)閞sync可以只同步需要更新的文件,而不是將所有的指定路徑內(nèi)的文件都拷貝一份,然后再目標(biāo)路徑下去覆蓋源文件,比如本地的/mnt/tem文件夾要和遠(yuǎn)程xx.xx.xx.123的/mnt/tem路徑做同步,可以使用:

rsync -avu --progress /mnt/tem/ xx@xx.xx.xx.123:/mnt/tem

其中:

-v 詳細(xì)輸出
-a 歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,如果文件屬性變了,認(rèn)為是不同文件
-u 選項(xiàng)忽略重復(fù)的數(shù)據(jù)

此外,rsync默認(rèn)拷貝軟連接,這一點(diǎn)和scp是不同的,scp會(huì)拷貝軟鏈接。而rsync如果想同步軟連接的話需要指定-l參數(shù)。

-v, --verbose 詳細(xì)模式輸出。
-q, --quiet 精簡(jiǎn)輸出模式。
-c, --checksum 打開校驗(yàn)開關(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路徑目錄樹以外的鏈結(jié)。
--safe-links 忽略指向SRC路徑目錄樹以外的鏈結(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ù)奈募?,以是加快隨后的再次傳輸。
--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 顯示幫助信息。

crontab定時(shí)功能

有了同步的功能,我們還要實(shí)現(xiàn)自動(dòng)化,這個(gè)自動(dòng)化,有好幾種方案,比如寫一個(gè)bash腳本,但是我沒(méi)找到一個(gè)合適的教程。

還有一種方案是:ubuntu下使用rsync+inotify-tools實(shí)現(xiàn)文件自動(dòng)備份之一
找到的教程寫的跟個(gè)鬼一樣,試了好幾次都沒(méi)有成功~

最后選擇最簡(jiǎn)單的crontab功能;

局域網(wǎng)內(nèi)自動(dòng)化同步文件夾詳細(xì)步驟

先介紹一下crontab的功能:
在這里插入圖片描述

直接從私房菜里面截了一張圖;

主要就是兩個(gè)指令:

1. crontab -l

crontab -l

顯示當(dāng)前crontab文件的工作內(nèi)容;
第一次執(zhí)行要輸入一個(gè)y,確認(rèn)一下權(quán)限;

2. crontab -e

第二個(gè)指令就是編輯了:

crontab -e

第一個(gè)執(zhí)行的時(shí)候,需要選擇哪個(gè)文件,選擇推薦的就行了。
比如我寫的就是下面的一個(gè)指令:

*/1 * * * * sshpass -p 'mypassword' rsync -avu --progress /home/robot/DRLib-D2S/ lyl@192.168.12.9:/home/robot2/robot_code/DRLibD2S/

關(guān)于crontab -e怎么保存退出的操作。
摁住ESC,然后Ctrl+X,好像就可以了。
不行的話多試幾次,遇到你輸入yes的,輸入一個(gè)y。
遇到:File Name to Write: /tmp/crontab.UO36KV/crontab
不想著修改的話,直接摁enter就行了

3. crontab的定時(shí)規(guī)則:

Cron 任務(wù)入門指南

分鐘(0-59) 小時(shí)(0-24) 日(1-31) 月(1-12) 星期(0-6) 要執(zhí)行的命令

在這里插入圖片描述
在上圖中,星號(hào)表示特定的時(shí)間塊。

要 每分鐘 執(zhí)行一次 cron 任務(wù),需使用如下格式。

* * * * * <command-to-execute>

其中<command-to-execute>要被完整的替代為你的命令,比如* * * * * mkdir demo_dir

要每 5 分鐘運(yùn)行一次 cron 任務(wù),請(qǐng)?jiān)?crontab 文件中添加以下內(nèi)容。

*/5 * * * * <command-to-execute>

要在每 1/4 個(gè)小時(shí)(每 15 分鐘)運(yùn)行一次 cron 任務(wù),請(qǐng)?zhí)砑右韵聝?nèi)容:

*/15 * * * * <command-to-execute>

要每小時(shí)的第 30 分鐘運(yùn)行一次 cron 任務(wù),請(qǐng)運(yùn)行:

30 * * * * <command-to-execute>

您還可以使用逗號(hào)定義多個(gè)時(shí)間間隔。例如,以下 cron 任務(wù)每小時(shí)運(yùn)行三次,分別在第 0、 5 和 10 分鐘運(yùn)行:

0,5,10 * * * * <command-to-execute>

每半小時(shí)運(yùn)行一次 cron 任務(wù):

*/30 * * * * <command-to-execute>

每小時(shí)運(yùn)行一次:

0 * * * * <command-to-execute>

4.sshpass免密碼操作!

一般來(lái)說(shuō)直接rsync,每次都需要輸入密碼。
而所謂的--password-file=/etc/rsync.pass的操作,只能在deamain能用,都是什么鬼玩意兒~

好在上次用scp傳圖的時(shí)候,學(xué)會(huì)了一個(gè)sshpass的包,可以直接在命令行將密碼直接傳進(jìn)去:

sudo apt-get install sshpass -y

現(xiàn)在終于可以實(shí)現(xiàn)服務(wù)器a同步到服務(wù)器b了:

  1. 在服務(wù)器a上輸入:
  2. crontab -e
  3. 在cron最后一行輸入:
  4. */2 * * * * sshpass -p 'mypassword' rsync -avu --progress /home/robota/DRLib-D2S/ lyl@192.168.12.13:/home/robotb/robot_code/DRLibD2S/
  5. 實(shí)現(xiàn)效果,每隔兩分鐘將服務(wù)器a的文件夾上傳到服務(wù)器b的文件夾中。
  6. 注意file/和file的區(qū)別,如果源目錄是file/的話,那么會(huì)將file/下面的內(nèi)容傳給目標(biāo)文件夾,如果是file的話,那么直接將file打包傳給目標(biāo)文件夾。
  7. 同樣的在b服務(wù)器也配置一個(gè),就能真正的同步了~

結(jié)束。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多