目錄
1. 服務器備份知識點
1.1?備份策略
1.2 備份步驟和寶塔面板簡介
1.3 CentOS7重要目錄
2. 備份工具
2.1?tar -g
備份演示
2. rsync
備份演示
3. rdiff-backup
備份演示
4. 差異和優缺點
3. rdiff-backup安裝和使用
3.1 備份命令rdiff-backup
3.2 恢復命令--restore-as-of
3.3 刪除命令--remove-older-than
3.4 備份目錄選擇
3.5 手動備份home目錄演示
第一次備份
第二次備份
第三次備份
恢復到第二次備份數據
3.6 自動化備份腳本
第一次備份
第二次備份
測試多目錄備份腳本
測試Linux定時任務
1. 寶塔面板
backEnd2
2. Linux定時任務命令
2.1 系統配置文件
2.2 用戶的配置文件
3 crontab?-e
3.1 定時測試:
3.2 每分鐘測試
3.3 定時任務注意事項
3.4 實際測試
3.5 測試睡眠時產生多個文件
3.6 最終備份腳本
監控Linux目錄差異
最終測試
最終監控腳本
本篇完。
1. 服務器備份知識點
1.1?備份策略
- 3份備份 除了原有的數據備份副本之外,應該始終保證有兩個額外的備份副本或版本。假設一份備份被損壞的的機率為1/100,那么三份備份遭到損壞的機率便僅為1/1000000,意味著在原本的備份基礎上多添加兩份保障。
- 2種介質至少在兩種不同的存儲介質上存儲數據副本,包括內部驅動器,以及外部媒介,如磁盤、磁帶、閃存、網絡存儲或云存儲等。將備份存放在不同的介質中,為的就是降低單一介質遭遇損壞的風險。
- 1份異地將至少一份備份數據存儲在異地作為異地副本,備份數據之間的隔離十分重要,將外部存儲設備與生產存儲設備存放在同一空間的行為并不明智,一旦遭遇洪水火災等自然災害時,數據就可能會有”團滅”的危機。
Linux備份通常可以分為以下幾個層次,這些層次主要基于備份的廣度和深度來劃分:
- 完全備份(Full Backup):
- 完全備份是指將所有需要備份的數據全部進行備份。這種備份方式會備份整塊硬盤、整個分區或某個具體的目錄中的所有數據。
- 完全備份的優點是恢復時簡單快捷,因為所有需要的數據都已經包含在備份文件中。
- 缺點是備份所需的時間和存儲空間較大,特別是當數據量很大時。
- 增量備份(Incremental Backup):
- 增量備份是在完全備份的基礎上,只備份自上一次備份(無論是完全備份還是增量備份)以來發生了更改的數據。
- 增量備份的優點是備份所需的時間和存儲空間較小,因為它只備份新增或修改的數據。
- 缺點是恢復時可能需要多個備份文件(包括完全備份和多個增量備份),恢復過程相對復雜。
- 差異備份(Differential Backup):
- 差異備份與增量備份類似,但它是基于上一次完全備份來備份之后所有發生更改的數據。即每次差異備份都會備份自上一次完全備份以來所有新增或修改的數據。
- 差異備份的優點是恢復時相對增量備份簡單,因為它只需要一個完全備份和一個最新的差異備份文件。
- 缺點是隨著時間的推移,差異備份文件可能會變得很大,因為它包含了自上次完全備份以來的所有更改。
????????對于數據變化不大的系統,可以選擇完全備份和定期的差異備份;而對于數據變化頻繁的系統,則可以選擇完全備份和頻繁的增量備份。
????????普通的備份策略比如:(一周一次全量備份,一天一次增量備份,全量備份可以用寶塔定時備份保存三份文件,自己備份也可以。)
1.2 備份步驟和寶塔面板簡介
一般備份步驟:
1. 數據識別與分類
- 識別重要數據:首先,需要明確哪些數據是業務關鍵或法律要求必須保留的。
- 數據分類:根據數據的敏感性、重要性和恢復時間目標(RTO)進行分類,以便制定合適的備份策略。
2. 備份策略制定
- 全備份與增量/差異備份:定期執行全備份,并在全備份之間執行增量或差異備份以減少存儲需求和備份時間。
- 備份頻率:根據數據變化頻率和業務需求確定備份的頻率。
- 備份保留周期:設定備份數據的保留時間,以滿足合規性和歷史記錄需求。
3. 備份介質與存儲
- 本地備份:使用硬盤、磁帶或NAS/SAN等本地存儲設備進行備份。
- 云備份:利用云服務提供商的存儲服務進行遠程備份,提供更高的數據可用性和災難恢復能力。
- 混合備份:結合本地和云備份的優勢,實現靈活的數據保護和恢復策略。
4. 系統配置備份
- 操作系統配置:備份操作系統的配置文件、注冊表(Windows)或系統文件(Linux)。
- 應用程序配置:備份所有關鍵應用程序的配置文件、數據庫連接字符串等。
- 網絡配置:備份路由器、交換機、防火墻等網絡設備的配置。
- 虛擬化環境配置:備份虛擬機模板、快照和虛擬機管理器的配置文件。
5. 備份驗證與測試
- 備份驗證:定期驗證備份數據的完整性和可恢復性,確保備份過程沒有錯誤。
- 災難恢復演練:定期進行災難恢復演練,測試備份數據的恢復流程和時間,確保在真實災難發生時能夠迅速恢復業務。
6. 安全與合規性
- 加密備份數據:對備份數據進行加密,防止數據在傳輸和存儲過程中被未經授權訪問。
- 訪問控制:對備份存儲設備和備份過程實施嚴格的訪問控制,確保只有授權人員能夠訪問備份數據。
- 合規性:確保備份策略符合行業法規和標準,如GDPR、HIPAA等。
7. 自動化與監控
- 自動化備份:使用自動化工具或腳本來執行備份任務,減少人為錯誤并提高備份效率。
- 監控與報警:實時監控備份過程和備份存儲設備的狀態,設置報警機制以便在出現問題時及時響應。
寶塔面板有上部分的大部分功能,快照的話,環境也會備份。
1.3 CentOS7重要目錄
在CentOS 7的備份過程中,根目錄(/
)下的目錄哪些需要被備份,主要取決于系統的具體使用情況和數據的重要性。以下是一些通常需要備份的關鍵目錄:
/etc
:- 這個目錄包含了系統的配置文件,包括網絡配置(如
/etc/sysconfig/network-scripts/
)、SSH配置(/etc/ssh/
)、防火墻和SELinux配置(/etc/firewalld/
、/etc/selinux/
)、主機名和主機文件(/etc/hostname
、/etc/hosts
)等。這些配置文件對于系統的正常運行至關重要,因此在備份時必須包含。
- 這個目錄包含了系統的配置文件,包括網絡配置(如
/home
:- 用戶的主目錄通常位于此目錄下,每個用戶都有一個以其用戶名命名的目錄,其中包含用戶的個人文件、配置、下載等。這些目錄對于保留用戶數據至關重要,因此在備份時必須包括。
/root
:- 如果root用戶經常用于執行重要任務或存儲關鍵文件,那么
/root
目錄也應該被備份。這個目錄包含了root用戶的主目錄和可能存儲在其中的配置文件或重要數據。
- 如果root用戶經常用于執行重要任務或存儲關鍵文件,那么
/var/log
:- 日志文件對于系統的故障排查和歷史記錄非常有用。如果需要保存系統的歷史記錄或用于后續的審計,那么
/var/log
目錄也應該被備份。
- 日志文件對于系統的故障排查和歷史記錄非常有用。如果需要保存系統的歷史記錄或用于后續的審計,那么
- 數據庫目錄:
- 如果系統上運行有數據庫服務(如MySQL、PostgreSQL等),那么數據庫的數據目錄和配置文件也需要被備份。具體的數據目錄位置取決于數據庫的配置,但通常可以在數據庫的配置文件中找到(如MySQL的
/etc/my.cnf
)。
- 如果系統上運行有數據庫服務(如MySQL、PostgreSQL等),那么數據庫的數據目錄和配置文件也需要被備份。具體的數據目錄位置取決于數據庫的配置,但通常可以在數據庫的配置文件中找到(如MySQL的
/usr/local
(或特定應用安裝目錄):- 如果在
/usr/local
或系統的其他非標準位置安裝了第三方軟件或應用,那么這些目錄也應該被備份。這包括應用程序的可執行文件、庫文件、配置文件和數據文件。
- 如果在
- 其他重要目錄:
- 根據系統的具體使用情況,可能還有其他重要目錄需要被備份,如
/var/spool/mail
(系統郵件目錄)、/var/spool/cron
(計劃任務目錄)等。
- 根據系統的具體使用情況,可能還有其他重要目錄需要被備份,如
????????需要注意的是,在備份過程中,一些目錄可能會被排除在外,因為它們包含了臨時文件或系統運行時所需的動態生成的文件。例如,/proc
、/sys
、/tmp
等目錄通常不需要備份,因為它們在系統重啟后會被重新生成或清空。
????????此外,對于整個系統的備份,可以使用tar
命令或dd
命令等工具來實現。tar
命令可以用于打包和壓縮特定的目錄和文件,而dd
命令則可以用于備份整個硬盤或分區。在選擇備份方法時,應根據系統的具體需求和數據的重要性來決定。
????????最后,備份完成后,應將備份文件存儲在安全可靠的位置,如外部硬盤、云存儲或遠程服務器,以確保在數據丟失或系統故障時能夠迅速恢復。
????????關機原因那個應該就是嘗試重啟到16700次,但是沒有重啟成功,同時slurmd還在運行,當時說下載東西,剛才查了一下有這種重啟很多次就會影響性能,然后性能不好的同時下載很多東西可能服務器就斷了,推測是這樣。
????????fVjWeDNS.service網上搜不到,冠凌那邊看他們的回復應該也不知道這個服務是干嘛的,我覺得可以先把嘗試啟動/bin/rRUBHDfR的那一行注釋掉,因為也找不到這個文件夾,一直嘗試執行也是個問題。
????????在Linux系統中,目錄結構遵循一套標準規范,不同的目錄用于存放不同類型的文件和數據。以下是您提到的目錄的詳細解釋以及是否需要備份的建議:
目錄解釋
????????在Linux系統中,目錄結構遵循一套標準規范,不同的目錄用于存放不同類型的文件和數據。以下是您提到的目錄的詳細解釋以及是否需要備份的建議:
-
bin
: 存放基本的用戶命令(如ls
,cp
,mv
等),通常是系統啟動時需要的基本命令。
備份建議: 建議備份,因為它包含基本的系統命令。 -
dev
: 包含設備文件,這些文件表示系統中的設備(如硬盤、終端等)。
備份建議: 通常不需要備份,因為這些文件在系統重啟時會自動生成。 -
home
: 存放用戶的個人文件和設置,每個用戶在此目錄下有一個子目錄。
備份建議: 強烈建議備份,因為它包含用戶的個人數據和配置。 -
lib
: 包含系統和應用程序所需的共享庫文件(動態鏈接庫)。
備份建議: 建議備份,因為某些應用程序和系統命令依賴于這些庫。 -
lib64
: 64位系統的共享庫目錄,類似于lib
,但專門用于64位庫。
備份建議: 建議備份,尤其在64位系統上。 -
mnt
: 通常為空,作為臨時掛載文件系統的掛載點。
備份建議: 通常不需要備份。 -
proc
: 虛擬文件系統,提供關于系統和進程的信息。
備份建議: 不需要備份,因為這些文件是動態生成的。 -
rpm
: 用于存放RPM包的目錄,可能包含軟件包的管理信息。
備份建議: 如果有特殊的軟件包或信息,可以考慮備份。 -
sbin
: 存放系統管理員使用的命令(如shutdown
,ifconfig
等)。
備份建議: 建議備份,因為這些命令通常需要在系統維護時使用。 -
srv
: 存放服務相關的數據,如HTTP服務器、FTP服務器的數據等。
備份建議: 根據服務的需要,建議備份。 -
tmp
: 存放臨時文件,系統和用戶都可以使用,通常在重啟后清空。
備份建議: 不需要備份,因為其內容是臨時的。 -
var
: 存放可變數據文件,如日志文件、郵件隊列、數據庫文件等。
備份建議: 強烈建議備份,因為它包含系統運行中的重要數據。 -
boot
: 包含啟動加載器和內核文件,系統啟動所需的文件。
備份建議: 建議備份,特別是在系統重裝或恢復時。 -
etc
: 存放系統配置文件和目錄(如網絡設置、用戶賬戶等)。
備份建議: 強烈建議備份,因為這些配置對于系統的正常運行至關重要。 -
media
: 通常用于掛載可移動媒體(如USB驅動器、CD-ROM等)。
備份建議: 根據需要,備份可移動媒體中的數據。 -
opt
: 存放附加的第三方應用程序。
備份建議: 根據具體安裝的應用程序,建議備份。 -
root
: 超級用戶的家目錄。
備份建議: 建議備份,因為可能包含重要的配置和數據。 -
run
: 包含當前運行時信息(如PID文件)。
備份建議: 不需要備份,因為其內容是動態的。 -
slurm
: 如果系統使用SLURM作為作業調度程序,通常包含相關的文件和信息。
備份建議: 根據使用情況,可能需要備份。 -
sys
: 提供系統信息,通常是虛擬文件系統。
備份建議: 不需要備份,因為其內容是動態的。 -
usr
: 包含用戶程序和共享數據,通常分為bin
,lib
,sbin
,share
等子目錄。
備份建議: 建議備份,因為包含很多用戶級別的應用程序。 -
www
: 通常是Web服務器的根目錄。
備份建議: 強烈建議備份,尤其是Web內容。
總結
- 強烈建議備份的目錄:?
home
,?var
,?etc
,?usr
,?boot
,?www
- 建議備份的目錄:?
bin
,?lib
,?lib64
,?sbin
,?srv
,?opt
,?root
,?rpm
- 通常不需要備份的目錄:?
dev
,?mnt
,?proc
,?tmp
,?run
,?sys
要加的目錄:
-
bin
: 存放基本的用戶命令(如ls
,cp
,mv
等),通常是系統啟動時需要的基本命令。
備份建議: 建議備份,因為它包含基本的系統命令。 -
lib
: 包含系統和應用程序所需的共享庫文件(動態鏈接庫)。
備份建議: 建議備份,因為某些應用程序和系統命令依賴于這些庫。 -
lib64
: 64位系統的共享庫目錄,類似于lib
,但專門用于64位庫。
備份建議: 建議備份,尤其在64位系統上。 -
sbin
: 存放系統管理員使用的命令(如shutdown
,ifconfig
等)。
備份建議: 建議備份,因為這些命令通常需要在系統維護時使用。 -
srv
: 存放服務相關的數據,如HTTP服務器、FTP服務器的數據等。
備份建議: 根據服務的需要,建議備份。 -
var
: 存放可變數據文件,如日志文件、郵件隊列、數據庫文件等。
備份建議: 強烈建議備份,因為它包含系統運行中的重要數據。 -
boot
: 包含啟動加載器和內核文件,系統啟動所需的文件。
備份建議: 建議備份,特別是在系統重裝或恢復時。 -
etc
: 存放系統配置文件和目錄(如網絡設置、用戶賬戶等)。
備份建議: 強烈建議備份,因為這些配置對于系統的正常運行至關重要。 -
root
: 超級用戶的家目錄。
備份建議: 建議備份,因為可能包含重要的配置和數據。 -
slurm
: 如果系統使用SLURM作為作業調度程序,通常包含相關的文件和信息。
備份建議: 根據使用情況,可能需要備份。 -
usr
: 包含用戶程序和共享數據,通常分為bin
,lib
,sbin
,share
等子目錄。
備份建議: 建議備份,因為包含很多用戶級別的應用程序。 -
www
: 通常是Web服務器的根目錄。
備份建議: 強烈建議備份,尤其是Web內容。 -
run
: 包含當前運行時信息(如PID文件)。
備份建議: 不需要備份,因為其內容是動態的。
2. 備份工具
2.1?tar -g
備份演示
全備份:
在oxTest目錄增加文件后增量備份:
恢復數據到 /home/rtx/oxTest2 :
恢復增量備份:
查看增量備份:
2. rsync
(加 --diff 選項可以實現同步刪除文件,類似差異備份,否則只能增量備份)
rsync
?是一個在 Linux 和 Unix 系統中廣泛使用的文件傳輸和同步工具。它可以在本地和遠程之間高效地復制和同步文件和目錄,同時盡量減少數據傳輸量,因為它只傳輸差異部分(即已更改的部分)。rsync
?非常適合用于備份和鏡像,以及作為高效的文件傳輸工具。
基本語法
rsync [選項] 源路徑 目標路徑 |
常用選項
-a
?或?--archive
:歸檔模式,表示以遞歸方式傳輸文件,并保持所有文件屬性,等同于?-rlptgoD
。-v
?或?--verbose
:詳細模式,輸出更多信息。-z
?或?--compress
:在傳輸時壓縮數據。-r
?或?--recursive
:遞歸復制目錄樹。-l
?或?--links
:復制符號鏈接作為符號鏈接。-p
?或?--perms
:保持文件權限。-t
?或?--times
:保持文件時間戳。-g
?或?--group
:保持文件組信息。-o
?或?--owner
:保持文件所有者信息(超級用戶才能使用)。-D
?或?--devices
:保持設備文件信息(超級用戶才能使用)。--delete
:刪除目標目錄中源目錄中沒有的文件(使兩邊內容一致)。--progress
:顯示傳輸進度。-e
:指定遠程 shell,用于通過 SSH 傳輸文件(如?-e "ssh -p 2222"
)。--contimeout=N
:設置連接超時時間,單位為秒。
示例
-
本地目錄同步:
rsync -avz /source/directory/ /destination/directory/
這個命令會將?
/source/directory/
?目錄下的所有內容(包括子目錄和文件)同步到?/destination/directory/
,同時保持文件屬性、壓縮數據,并顯示詳細過程。 -
通過 SSH 遠程同步:
rsync -avz -e "ssh -p 2222" /local/directory/ user@remotehost:/remote/directory/
這個命令會將本地的?
/local/directory/
?目錄通過 SSH(假設 SSH 端口為 2222)同步到遠程主機?remotehost
?的?/remote/directory/
?目錄下。 -
刪除目標目錄中不存在的文件:
rsync -avz --delete /source/directory/ /destination/directory/
這個命令除了同步文件外,還會刪除?
/destination/directory/
?中那些在?/source/directory/
?中不存在的文件,使兩邊內容完全一致。
備份演示
第一次全備份:
添加一個文件后增量備份:
無法把增量備份中增量的數據單獨做成一個文件:
rsync是傳輸和同步文件,目的文件沒有壓縮。
3. rdiff-backup
????????在Linux的CentOS 7中,差異備份工具的一個常用選項是rdiff-backup。rdiff-backup工具特別適用于累積差異備份,通過它,用戶可以僅備份自上次完整備份或差異備份以來發生變化的數據,從而節省存儲空間并提高效率。(在公司用rdiff-backup備份的話,像home目錄和其它重要目錄,可以每天備份一次,然后其他數據庫的數據可以兩天備份一次,環境之類的不太懂在哪個文件,然后會修改的其他文件就可以一周備份一次,都保留兩份)
rdiff-backup ==> 用于累積差異備份,加上自己寫的shell script,每日備份,效果更佳
????????先用yum search rdiff-backup看看是否yum源含有rdiff-backup這個package,若沒有的話請yum install epel-release
接下來yum install?rdiff-backup
用法用man來查一下吧,直接貼一份腳本:
?
(方括號相當于兩個小括號,用來判斷真假)
腳本文件下載地址:?百盤?密碼:?9af9
然后設定每日定時進行差異備份
?
?
我設定為每日晚上10點自動進行差異備份
下面,查看一下服務器備份的情況
?
可以通過時間來還原該目錄下的某個文件或者該整個目錄,還原方法如下:
(以下皆為演示需要才新建backuptest文件夾,若真正需要還原的時候可以直接指定到目標文件夾進行覆蓋 比如: rdiff-backup -r now /backup/etc.dir /etc? 實驗的時候最好不要這樣用)
1.按時間還原整個目錄
?
還原只會按指定時間之前最近的一次備份進行還原,比如上面我寫now,那么它會找到在當前時間之前最近的一次備份進行還原,也就是還原到上2圖中的Current mirror: Tue Dec 12 22:00:01 2017這個時間
?
可以看到,還原后,該文件夾的時間確實是那個時間點之前的時間,說明該目錄最后一次修改是在20:49:13這個時間,
若要單獨還原某文件到某個時間點可以進行如下操作:
首先通過man rdiff-backup來查看下還原部分介紹RESTORING開頭的部分
?
????????該部分內容介紹了,凡是以.diff,.snapshot,.dir,.gz(被gzip壓縮后)皆可進行還原,而.missing表示文件在該時間點后已經不存在
????????rdiff-backup-data文件夾下放的是差異文件,這些都是整個目錄的差異備份文件(可以直接使用該文件還原到某個時間點)
?
????????而rdiff-backup-data目錄內的increments記錄的是etc這個文件夾下文件的差異備份文件(可以使用該文件進行還原etc目錄下的某個文件到某個時間點)
下面舉例還原/etc/resolve.conf這個文件,首先查看下差異備份文件:
?
還原時間為2017-12-11 22:45:06,查看下我們本地文件
?
本地文件時間為2017-12-12 20:49:13,因此現在將該文件還原到上述差異備份文件所在的時間點
?
????????以上便成功將文件還原到了2017-12-11 22:45:06那個時候的狀態,你可能會奇怪,為什么文件的日期卻是2017-12-10 11:15:28?這是因為我們的rdiff-backup程序只會記錄備份時間,而不會修改文件的任何屬性,這說明在2017-12-11 22:45:06這個時間的時候,文件的modification time(-mtime)便是2017-12-10 11:15:28
備份演示
?
?
差異備份(增和減):
?
?
4. 差異和優缺點
在CentOS 7的備份策略中,tar
、rsync
和rdiff-backup
是三種常用的工具,它們各自適用于不同的場景,并具有不同的優缺點。
1. tar -g
適用情況:
- 全系統或目錄備份:tar命令非常適合用于整個系統或指定目錄的備份。它可以保留文件權限、所有者和其他屬性,非常適合在災難恢復時重建系統或目錄結構。
優點:
- 靈活性高:可以指定任意目錄進行備份,也可以包含或排除特定文件。
- 保留文件屬性:備份時保留文件的權限、時間戳等屬性。
- 支持多種壓縮格式:如gzip、bzip2等,可以有效減少備份文件的大小。
缺點:
- 恢復時需要額外操作:恢復時可能需要手動重新創建被排除的目錄(如/proc、/sys等)。
- 備份時間較長:對于大型目錄或系統,備份過程可能需要較長時間。
2. rsync
適用情況:
- 遠程和本地同步:rsync非常適合在本地和遠程系統之間同步文件和目錄。它支持增量備份,只傳輸更改過的部分,從而節省時間和帶寬。
優點:
- 增量備份:只備份自上次備份以來更改過的數據,減少備份時間和存儲空間。
- 保持文件屬性:保留原始文件的權限、時間戳、軟硬鏈接等。
- 壓縮傳輸:在傳輸過程中可以壓縮數據,減少帶寬使用。
- 安全性:可以通過SSH等安全協議傳輸數據。
缺點:
- 恢復功能有限:rsync本身不直接提供恢復功能,通常需要與其他工具結合使用。
- 依賴外部連接:在遠程備份時,依賴穩定的網絡連接。
3. rdiff-backup
適用情況:
- 高效增量備份:rdiff-backup結合了增量備份和鏡像備份的優點,非常適合需要頻繁備份且數據量大的場景。
優點:
- 高效性:通過增量備份和數據壓縮技術,顯著提高備份效率,減少存儲空間的占用。
- 靈活性:支持本地和遠程備份,用戶可以根據需要選擇合適的備份方式。
- 安全性:使用SSH進行數據傳輸,確保備份數據的安全性。
- 恢復功能強大:支持按時間點恢復文件或整個目錄,用戶可以恢復到任意一個歷史備份點。
缺點:
- 學習曲線:對于初學者來說,可能需要一定時間來熟悉其命令和選項。
- 依賴外部工具:在Windows等非Linux系統上使用時,可能需要借助其他工具(如Cygwin)來運行。
?
3. rdiff-backup安裝和使用
????????在Linux的CentOS 7中,差異備份工具的一個常用選項是rdiff-backup。rdiff-backup工具特別適用于累積差異備份,通過它,用戶可以僅備份自上次完整備份或差異備份以來發生變化的數據,從而節省存儲空間并提高效率。rdiff-backup不能備份非目錄,文件可以新建一個目錄放進去。
????????在CentOS或RHEL系統上,可以使用yum
包管理器來安裝rdiff-backup:
sudo yum install epel-release
sudo yum install rdiff-backup
3.1 備份命令rdiff-backup
使用 rdiff-backup 命令將?example
?目錄備份到?example-backup
?目錄:
rdiff-backup example example-backup
第二次備份操作,rdiff-backup 會自動進行增量備份:
使用?--list-increments
?選項列出所有備份信息:
rdiff-backup --list-increments example-backup
或者使用?--list-increment-sizes
?以表格形式列出備份大小:
rdiff-backup --list-increment-sizes example-backup
3.2 恢復命令--restore-as-of
????????執行備份命令到新目錄時,新目錄下會生成一個rdiff-back-data的目錄,里面有很多文件,命名為同一時間的就可以用rdiff-backup?--restore-as-of恢復到當時備份的時間。
用?--restore-as-of
?選項指定要恢復的時間點。例如,恢復到某個具體時間:
rdiff-backup --restore-as-of 'Sun Sep 8 11:42:30 2024' example-backup example-restore
或者恢復到最新備份:
rdiff-backup --restore-as-of now example-backup example-restore
如果目標目錄已存在,可以使用?--force
?選項強制覆蓋:
rdiff-backup --restore-as-of now --force example-backup example
3.3 刪除命令--remove-older-than
為了節省存儲空間,可以刪除舊的備份文件。以下是刪除舊備份的基本步驟:
使用?--remove-older-than
?選項刪除指定時間之前的備份。例如,刪除一天前的備份:
rdiff-backup --remove-older-than 1D example-backup
如果需要刪除多個備份,可以使用?--force
?選項:
rdiff-backup --remove-older-than 1D --force example-backup
man查看--remove-older-than
詳細信息:
s,m,h,D,W,M,Y,分別代表秒,分,時,天,周,月,年
回來演示刪除一天前的備份:
目前來看rdiff-backup-data里有差異備份的才會刪除,否則不會刪除
3.4 備份目錄選擇
公司服務器磁盤:
?
?
?
現在可以暫時備份home目錄和root目錄和etc目錄和www目錄,分別備份到兩個back目錄里。
3.5 手動備份home目錄演示
rdiff-backup --include /dir1/important_files dir1 dir2
第一次備份
?
把/home目錄的所有內容備份到一個新建的目錄:/homeBack
?
除了原有的數據還多了一份rdiff-backup-data目錄,新備份homeBack里的可執行文件也可執行
?
?
第二次備份
進入原home目錄里增加一個文件和刪除一個文件后,進行第二次備份
?
目標目錄的rdiff-backup-data里自動增加了多份新文件
?
第三次備份
類似第二份備份的操作,在原home目錄修改一些文件后再進行第三次備份:
?
目標目錄的rdiff-backup-data里也自動新增了一系列第三次備份的相關文件:
?
恢復到第二次備份數據
?
rdiff-backup-data生成了一份恢復日志,里面的其它內容沒有變化
?
進入原home目錄后發現確實恢復到了第二份備份的數據(無TestAdd2.txt,Test目錄沒修改成TestDiff)。
?
3.6 自動化備份腳本
rdiff-backup備份腳本:
#!/bin/bash
sour_dirs="/home/back1" # 設置要備份的目錄列表
dest_dirs="/home/back2" # 設置備份目標目錄(遠程或本地)
log_file="/home/back2/back.log" # 設置備份日志文件的路徑
date=$(date +'%y%m%d %H:%M:%S') #備份的日期[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目標目錄不存在就創建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就創建
echo "===========================${date}=======================" >>$log_file
for s_dir in $sour_dirs
do d_dir=$dest_dirs${s_dir}.dir[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就創建rdiff-backup $s_dir $d_dir #將源文件分別備份為 源文件名.dirif [ $? == 0 ]; then #如果上一個命令沒出問題就繼續succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 1M $d_dir #移除一個月以前的備份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #獲取日志信息fi;elsefail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息fi;
done
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #輸入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than 1 month files is all above)\n" >> "$log_file"
第一次備份
在下面環境運行以上腳本:
日志文件和data目錄都正常:
第二次備份
進入原/home/back1目錄里增加一個文件和刪除一個文件后,進行第二次備份
data目錄也正常:
測試多目錄備份腳本
運行以下腳本:
結果和預料一樣:
測試Linux定時任務
#!/bin/bash
sour_dirs="/home/back1 /home/back0" # 設置要備份的目錄列表
dest_dirs="/home/backEnd2" # 設置備份目標目錄(遠程或本地)
log_file="/home/backEnd2/back.log" # 設置備份日志文件的路徑
date=$(date +'%Y%m%d %H:%M:%S') #備份的日期[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目標目錄不存在就創建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就創建
echo "===========================${date}=======================" >>$log_file
for s_dir in $sour_dirs
do d_dir=$dest_dirs${s_dir}.dir[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就創建rdiff-backup $s_dir $d_dir #將源文件分別備份為 源文件名.dirif [ $? == 0 ]; then #如果上一個命令沒出問題就繼續succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 15m $d_dir #移除15分鐘以前的備份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #獲取日志信息fi;elsefail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息fi;
done
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #輸入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than 1 month files is all above)\n" >> "$log_file"
1. 寶塔面板
成功定時啟動了shell腳本:
backEnd2
一分鐘執行一次腳本,刪除5分鐘前的備份(無差異備份的話,不會刪除):
#!/bin/bash
sour_dirs="/home/back1 /home/back0" # 設置要備份的目錄列表
dest_dirs="/home/backEnd2" # 設置備份目標目錄(遠程或本地)
log_file="/home/backEnd2/back.log" # 設置備份日志文件的路徑
date=$(date +'%y%m%d %H:%M:%S') #備份的日期[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目標目錄不存在就創建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就創建
echo "===========================${date}=======================" >>$log_file
for s_dir in $sour_dirs
do d_dir=$dest_dirs${s_dir}.dir[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就創建rdiff-backup $s_dir $d_dir #將源文件分別備份為 源文件名.dirif [ $? == 0 ]; then #如果上一個命令沒出問題就繼續succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 5m $d_dir #移除5分鐘以前的備份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #獲取日志信息fi;elsefail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息fi;
done
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #輸入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than files is all above)\n" >> "$log_file"
15:55
1分鐘后:
?在back1里創建文件:
發現有很多文件但沒刪除:(因為無差異備份的話,不會刪除)
看back0:
繼續一直在back1創建文件,在back0也創建:
過一會發現有差異備份且過了5分鐘的文件都刪除了,包括前面文件中沒有差異備份的。
測試完成
2. Linux定時任務命令
????????定時任務無非就是在什么時間干什么命令。文件怎么配置?定時任務一般用root執行,這里介紹crontab,crontab -e 用戶定時任務,有語法檢查功能。直接編輯系統的定時任務:
vim /etc/crontab
可以在里面直接寫,但一般用crontab -e寫:
crontab -e
接下來就是怎么去寫?
* * * * * echo hello
五顆星代表分時日月周
- 分0-59
- 時0-23 0表示凌晨12點
- 日1-31天
- 月1-12月
- 周0-6天,0和7都表示星期天
示例1:每天七點半吃早餐
30 07 * * * root echo 吃早餐 #寫echo,實際當前解釋器是看不到的,可以通過日志查看
示例2:每天晚上11點準時睡覺
00 23 * * * root echo 睡覺
示例3:每分鐘輸出自己的姓名
* * * * * root echo GR
示例4:每個小時的第5分鐘執行echo hello
5 * * * * root echo hello
示例5:每10分鐘執行echo hello
10 * * * * root echo hello
示例6:早上7點到上午11點執行echo hello
00 7-11 * * * root echo hello
示例7:早上7點到上午11點,下午一點到下午三點執行echo hello
00 7-11,13-15 * * * root echo hello #用逗號表示間隔
簡單看下配置文件:
2.1 系統配置文件
- /etc/crontab 系統定時任務
- /var/log/cron 定時任務日志
- /var/spool/mail/root?是root的郵件信息,每執行一次就提示一次信息(一般都關閉這個,因為影響性能)
- /etc/cron.hourly 每小時執行一次的定時任務配置文件
- /etc/cron.daily 每天執行一次的定時任務配置文件
- /etc/cron.weekly 每周執行一次的定時任務配置文件
- /etc/cron.monthly 每月執行一次的定時任務配置文件
- /etc/cron.deny 不允許哪個用戶進行定時任務
2.2 用戶的配置文件
- /var/spool/cron/root 用戶定時任務,vim編輯但不支持語法檢查,用crontab -e就可以檢查了
- crontab -e 編輯 ---->實際寫入到/var/spool/cron/? ? ? ? ? #有語法檢測的功能
- crontab -l 列出定時任務
3 crontab?-e
rbShell2.sh的內容:(刪除5分鐘前的備份)
#!/bin/bash
sour_dirs="/home/back1 /home/back0" # 設置要備份的目錄列表
dest_dirs="/home/backEnd3" # 設置備份目標目錄(遠程或本地)
log_file="/home/backEnd3/back.log" # 設置備份日志文件的路徑
date=$(date +'%y%m%d %H:%M:%S') #備份的日期[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目標目錄不存在就創建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就創建
echo "===========================${date}=======================" >>$log_file
for s_dir in $sour_dirs
do d_dir=$dest_dirs${s_dir}.dir[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就創建rdiff-backup $s_dir $d_dir #將源文件分別備份為 源文件名.dirif [ $? == 0 ]; then #如果上一個命令沒出問題就繼續succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 5m $d_dir #移除5分鐘以前的備份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #獲取日志信息fi;elsefail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息fi;
done
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #輸入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than files is all above)\n" >> "$log_file"
3.1 定時測試:
(次數測試的時候,腳本里面是刪除30分鐘前的)
每天的11:20執行一次腳本(五個* 分別是,分,時,日,月,周)
執行結果,成功執行:
如果想每10分鐘執行一次怎么寫的,注意:這樣寫是每小時的第10分鐘執行一次
10 * * * * sh /home/rtx/rdiff-backupTest/rdiff-backup_shell/rbShell.sh
?目前時間11:25
13:10:后
3.2 每分鐘測試
每1分鐘自動執行一次(在第一顆*后面加/1):
*/1 * * * * sh /home/rtx/rdiff-backupTest/rdiff-backup_shell/rbShell.sh
現在是16.14
1分鐘后發現自動完成了備份:
在back1里創建文件:
過了幾分鐘:
因為在16:20又創建了文件,過了幾分鐘發現16:20及之前的文件都被刪除了:
符合預期
3.3 定時任務注意事項
- 在定時任務中不識別%需要加轉義\% 或者將命令寫到腳本里面
- 執行腳本盡量前面加上sh或者bash使用
- /server/scripts/backup.sh 需要給腳本執行權限
- sh /server/scripts/backup.sh 不需要腳本執行權限
????????執行腳本的結果,定時任務的結果定向到空或者文件中,在執行每條定時任務后,系統會自動給用戶發送文件信息,/var/spool/mail/root 對于有用戶訪問的服務器會將郵件功能關閉 以減少性能損失,關閉后定時任務執行后發郵件發布出去,會生成臨時的小文件,執行一行定時任務會執行一個小文件,小文件越多會導致inode不夠用,無法寫入數據到磁盤。
查看郵件功能是否開啟:
systemctl stat postfix.service
關閉郵件功能:
systemctl stop postfix.service
-
避免不必要的程序及命令輸出,比如tar zcf,tar zcvf,不用v
- 打包盡量到相對路徑,一般打包都先cd,在tar,但是當前解釋器不會真的cd,而是在新的解釋器下,所以不影響當前界面。
????????定時任務的腳本中,程序盡量使用絕對路徑,用戶定時任務識別的PATH變量,只有/usr/bin/和/bin目錄,使用crontab定義定時任務時 只去/usr/bin/和/bin下面查找任務,比如使用ntpdate就成功不了,可以去查看郵件,郵件輔助我們排查問題
寫定時腳本的流程
- 命令行可以執行成功
- 寫入腳本,執行腳本可以執行成功
- 寫入定時任務進行測試
- 排查問題(結果,postfix開啟郵件,個人經驗)
3.4 實際測試
#!/bin/bash
sour_dirs="/home/data" # 設置要備份的目錄列表
dest_dirs="/home/back/databack" # 設置備份目標目錄(遠程或本地)
log_file="/home/back/back.log" # 設置備份日志文件的路徑
date=$(date +'%Y%m%d %H:%M:%S') #備份的日期[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目標目錄不存在就創建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就創建
echo "===========================${date}=======================" >>$log_file
for s_dir in $sour_dirs
do d_dir=${dest_dirs}[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就創建rdiff-backup $s_dir $d_dir #將源文件分別備份為 源文件名.dirif [ $? == 0 ]; then #如果上一個命令沒出問題就繼續succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 7D $d_dir[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #獲取日志信息fi;elsefail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息fi;
done
echo -e "[BACKUP SUCCESS]\n$succ_msg" >> "$log_file" #輸入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg" >> "$log_file"
echo -ne "[REMOVE FILES ]\n${rmv_msg}" >> "$log_file"
echo -e "(remove older than files is all above)\n" >> "$log_file"
3.5 測試睡眠時產生多個文件
睡眠一分鐘,一分鐘內創建了一個目錄,進入新創建的目錄,在里面創建一個文件和一個目錄:
????????發現睡眠和創建文件都執行了多次(一分鐘一次,用創建精確到秒的txt文件來代替調用腳本),現在測試一下用天的日期作為flag來讓其一天執行一次類似調用腳本的操作。
測試以下shell.sh:
#!/bin/bash # 設置要監視的目錄路徑
FILE_PATH="/home/data"# 注意:這里只使用 path 變量,并忽略 action 和 file(因為它們不是默認輸出的一部分)
inotifywait -mr -e create "$FILE_PATH" | while read path action file; do# 假設 path 變量現在包含完整的文件路徑log_file="/home/rtx/log/monitor1_log/$(date +"%Y-%m-%d").log"# 如果文件存在就進入下一次監控,保證else后面的代碼一天只執行一次if [ -f "$log_file" ];echo "$(date +"%Y-%m-%d %H:%M:%S")目錄 '$FILE_PATH' 里 '$file' 已被 '$action' "echo "日志存在,進入下一次監控"else# 如果日志文件不存在且不是目錄,則創建它 sleep 60touch "$log_file"# 所有輸出重定向到當天的日志文件exec >> "$log_file" 2>&1echo "$(date +"%Y-%m-%d %H:%M:%S")目錄 '$FILE_PATH' 里 '$file' 已被 '$action' "echo "---------------------------------------"echo "腳本被調用"touch /home/rtx/Test$(date +"%Y-%m-%d-%H-%M-%S").txtfi
done
3.6 最終備份腳本
#!/bin/bash
sour_dirs="/home/home /home/admin" # 設置要備份的目錄列表
dest_dirs="/home/back" # 設置備份目標目錄(遠程或本地)
log_file="/home/log/back_log/$(date +'%Y-%m-%d').log" # 設置備份日志文件的路徑
date=$(date +'%Y-%m-%d %H:%M:%S') #備份的日期[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目標目錄不存在就創建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就創建
# 所有輸出重定向到當天的日志文件
exec >> "$log_file" 2>&1
echo "===========================${date}======================="
for s_dir in $sour_dirs
dod_dir=$dest_dirs${s_dir}_back[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就創建rdiff-backup $s_dir $d_dir #將源文件分別備份為 源文件名_backif [ $? == 0 ]; then #如果上一個命令沒出問題就繼續succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 6M $d_dir #移除6個月以前的備份文件[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #獲取日志信息fi;elsefail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息fi;
done
echo -e "[BACKUP SUCCESS]\n$succ_msg" #輸入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg"
echo -ne "[REMOVE FILES ]\n${rmv_msg}"
echo -e "(remove older than files is all above)\n"
監控Linux目錄差異
????????inotifywait 是一個用于監控文件系統事件的命令行工具,屬于 inotify-tools 軟件包。它基于 Linux 內核的 inotify 功能,可以實時監聽文件或目錄的變化,如創建、刪除、修改等事件。
安裝所用工具:
sudo yum install inotify-tools
命令行運行后可以發現輸出了三個字段,這三個字段在后面的腳本可用可不用。
運行腳本:
#!/bin/bash # 設置要監視的目錄路徑
FILE_PATH="/home/data" # 初始化日志(可選,有助于確認腳本已啟動)
echo "開始監視目錄 '$FILE_PATH'..."# 監視文件修改和創建事件(還可監視刪除,打開關閉等)
# 注意:這里只使用 path 變量,忽略 action 和 file(因為它們不是默認輸出的一部分)
inotifywait -mr -e modify,create "$FILE_PATH" | while read path; do sleep 10# 可以添加對特定文件的條件檢查或調用其他腳本 # 例如:if [ "$path" == "$FILE_PATH/specific_file.txt" ]; then ... fi # 調用腳本/home/data/shell.sh
done# nohup /home/shell.sh > /home/test.log 2>&1 &
-m
?選項表示以監視模式運行,即持續監控而非一次性運行。-r
?選項表示遞歸監視指定目錄及其子目錄。-e modify,create
?指定監視的事件類型,這里監視文件的修改和創建。"$FILE_PATH"
?是要監視的目錄路徑。|
?將?inotifywait
?的輸出傳遞給后續的?while read
?循環。while read path; do
?循環從?inotifywait
?的輸出中讀取每一行,path
?變量包含了文件路徑和事件信息(inotifywait
?的默認輸出中通常包括事件的路徑和操作)
輸入以下命令在后臺運行上面的腳本
nohup /home/shell.sh > /home/test.log 2>&1 &
- nohup:允許腳本在你退出終端后繼續運行。
- /home/shell.sh:腳本的完整路徑。
- > /home/test.log:將標準輸出重定向到 test.log 文件。
- 2>&1:將標準錯誤也重定向到 test.log 文件。
- &:將命令放到后臺執行。
如果在腳本里輸出了日志到其他文件,可以把標準輸出重定向到空文件:
nohup /home/rtx/shell.sh > /dev/null 2>&1 &
FILE_PATH="/home/rtx/data" # 注意:這里只使用 path 變量,并忽略 action 和 file(因為它們不是默認輸出的一部分)
inotifywait -mr -e modify,create "$FILE_PATH" | while read path; do # 假設 path 變量現在包含完整的文件路徑sleep 7log_file="/home/rtx/log/$(date +"%Y-%m-%d").log"# 如果日志文件不存在且不是目錄,則創建它 [ ! -f "$log_file" ] && touch "$log_file"# 所有輸出重定向到當天的日志文件exec > "$log_file" 2>&1echo "---------------------------------------"echo "$(date +"%Y-%m-%d %H:%M:%S")目錄 '$FILE_PATH' 里 '$path' 已被修改或創建"# 在這里可以添加對特定文件的條件檢查或調用其他腳本 # 例如:if [ "$path" == "$FILE_PATH/specific_file.txt" ]; then ... fi # 調用腳本(如果需要) # script.sh "$path"
done
最終測試
把前面定時任務的腳本改一下日志:
#!/bin/bash
sour_dirs="/home/data" # 設置要備份的目錄列表
dest_dirs="/home/back/databack" # 設置備份目標目錄(遠程或本地)
log_file="/home/log/back_log/$(date +'%Y-%m-%d').log" # 設置備份日志文件的路徑
date=$(date +'%Y-%m-%d %H:%M:%S') #備份的日期
?
[ ! -d $dest_dirs ] && mkdir -p $dest_dirs #如果目標目錄不存在就創建
[ ! -d $log_file ] && touch $log_file #如果日志文件不存在就創建
# 所有輸出重定向到當天的日志文件
exec > "$log_file" 2>&1
echo "===========================${date}======================="
for s_dir in $sour_dirs
do ?d_dir=${dest_dirs}[ ! -f $d_dir ] && mkdir -p $d_dir #如果源文件名.dir不存在就創建rdiff-backup $s_dir $d_dir #將源文件分別備份為 源文件名.dirif [ $? == 0 ]; then ? #如果上一個命令沒出問題就繼續succ_msg=${succ_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息if [ $? == 0 ]; thenrdiff-backup --force --remove-older-than 7D $d_dir[ $? == 0 ] && rmv_msg=${rmv_msg}"$d_dir\n" #獲取日志信息fi;elsefail_msg=${fail_msg}"source: $s_dir, dest: $d_dir\n" #獲取日志信息fi;
done ?
echo -e "[BACKUP SUCCESS]\n$succ_msg" #輸入日志信息到日志文件
echo -e "[BACKUP FAILED ]\n$fail_msg"
echo -ne "[REMOVE FILES ]\n${rmv_msg}"
echo -e "(remove older than files is all above)\n"
監控腳本改一下日志和調用上面的腳本:
#!/bin/bash ? ?# 設置要監視的目錄路徑 ? ?
FILE_PATH="/home/rtx/data" ?# 注意:這里只使用 path 變量,并忽略 action 和 file(因為它們不是默認輸出的一部分) ?
inotifywait -mr -e modify,create "$FILE_PATH" | while read path; do ? ?# 假設 path 變量現在包含完整的文件路徑sleep 7log_file="/home/log/monitor_log/$(date +"%Y-%m-%d").log"# 如果日志文件不存在且不是目錄,則創建它 ? ?[ ! -f "$log_file" ] && touch "$log_file"# 所有輸出重定向到當天的日志文件exec > "$log_file" 2>&1echo "---------------------------------------"echo "$(date +"%Y-%m-%d %H:%M:%S")目錄 '$FILE_PATH' 里 '$path' 已被修改或創建"# 在這里可以添加對特定文件的條件檢查或調用其他腳本 ?# 例如:torif [ "$path" == "$FILE_PATH/specific_file.txt" ]; then ... fi ?# 調用腳本(如果需要) ? ?# script.sh "$path" ? /home/shellTest.sh
done
數據也備份了:
測試普通用戶監視:
最終監控腳本
#!/bin/bash # 設置要監視的目錄路徑
FILE_PATH="/home/data" error_log="/home/admin/log/error.log" #錯誤日志,確保創建好,因為還沒重定向到每天的日志# 設置日志目錄,下面還會創建每天的日志文件
LOG_DIR="/home/admin/log/auto_monitor_log"
if [ ! -d $LOG_DIR ]; thenmkdir -p $LOG_DIR #如果目標目錄不存在就創建if [ $? -ne 0 ]; then #如果上一條命令不正常echo "$(date +"%Y-%m-%d %H:%M:%S") 無法創建日志目錄 '$LOG_DIR'" >> $error_logfi
fi# 監控上面目錄的創建操作,把輸出讀取到path,action,file三個變量里
inotifywait -mr -e create "$FILE_PATH" | while read path action file; do # 定義當天的日志文件log_file="$LOG_DIR/$(date +"%Y-%m-%d").log"sleep 1# 如果文件存在就進入下一次監控,保證else后面的代碼一天只執行一次if [ -f "$log_file" ]; thenecho "$(date +"%Y-%m-%d %H:%M:%S")目錄 '$FILE_PATH' 里 '$file' 已被 '$action' "echo "$log_file 日志存在,進入下一次監控"else # 如果日志文件不存在且不是目錄,則創建它 sleep 60touch "$log_file"if [ $? -ne 0 ]; then #如果上一條命令不正常echo "$(date +"%Y-%m-%d %H:%M:%S") 無法創建日志文件 '$log_file'" >> $error_logfi# 所有輸出重定向到當天的日志文件exec >> "$log_file" 2>&1echo "$(date +"%Y-%m-%d %H:%M:%S")目錄 '$FILE_PATH' 里 '$file' 已被 '$action' "echo "$(date +"%Y-%m-%d %H:%M:%S") 腳本被調用"echo "---------------------------------------"fi
done