
我想每個星期五晚上進行一次備份(不,這不是整個備份例程,只是其中的一部分)。每個週五晚上的備份直到 4 週後才會被覆蓋。因此,本質上,我有四個循環備份:第 1 週、第 2 週、第 3 週和第 4 週。
現在,我需要 week1 備份腳本每 4 週運行一次。但我還希望 week2 的腳本每四個星期運行一次。我知道我可以告訴 crontab 每 X 週/天/小時/無論什麼執行一些事情。但是,我如何設定才能使這四個腳本中的每一個實際上在不同的周運行,如何避免所有 4 個腳本在同一晚運行,然後盡職盡責地等待數週才全部再次運行?
答案1
與其設計如此複雜的備份例程,不如考慮使用 Bacula,它是一款企業級免費開源軟體。 Bacula 非常靈活,它可以以您想要的幾乎所有可能的方式自動執行備份作業。
即使您能夠制定手動解決方案,它也有很多缺點:
- 追蹤錯誤將是大問題
- 追蹤工作將是一件令人頭痛的事
- 手動設定始終需要持續監控
最好的系統管理員是這樣一個人,他可以自動化一切並坐下來放鬆。
答案2
我認為弗蘭克的答案是最好的,但是按照你所描述的那樣,你可以有一個 cronjob 每週五備份,然後使用日誌輪換來保留最後四個副本。或尋找任何超過四個星期的備份。
答案3
一種替代方案:將複雜性放入腳本中,因為它比 cron 能夠更好地處理這種複雜性。所以(假設是 bash):
- 讓您的 cron 作業每週五執行相同的腳本。
- 修改您的腳本以給出自紀元以來的周數的模 4:
(愚蠢的格式問題,需要在此處放置虛擬文字)
epochsecs=`date +%s` # second since epoch
和
weeknum=`expr $epochsecs / 86400 / 7 % 4` # weeks since epoch, modulo 4
使用該數字作為備份檔案名稱的一部分。
backupfile=/path/to/backup/file.$weeknum
覆蓋舊的備份檔案。
rm $backupfile tar czvf $backupfile /bunch/of /目錄
或者,只需使用帶有日期的檔案名稱後綴:
backupfile=/path/to/backup/file.`date +%Y-%m-%d`
然後在腳本中執行 find 來刪除超過 28 天的備份檔案:
find /path/to/backup -maxdepth 1 -ctime +28 -delete
無論如何,不要讓 cron 承受如此複雜的負擔。在腳本中處理它,這可能能夠更好地處理複雜性。