## 15.4 可喚醒停機期間的工作任務
想像一個環境,你的 Linux 服務器有一個工作是需要在每周的星期天凌晨 2 點進行,但是很不巧的,星期六停電了~所以你得要星期一才能進公司去啟動服務器。 那么請問,這個星期天的工作調度還要不要進行?因為你開機的時候已經是星期一,所以星期天的工作當然不會被進行,對吧!
問題是,若是該工作非常重要 (例如例行備份), 所以其實你還是希望在下個星期天之前的某天還是進行一下比較好~那你該怎辦?自己手動執行?如果你跟鳥哥一樣是個記憶力超差的家伙,那么肯定“記不起來某個重要工作要進行”的啦! 這時候就得要靠 anacron 這個指令的功能了!這家伙可以主動幫你進行時間到了但卻沒有執行的調度喔!
### 15.4.1 什么是 anacron
anacron 并不是用來取代 crontab 的,anacron 存在的目的就在于我們上頭提到的,在處理非 24 小時一直啟動的 Linux 系統的 crontab 的執行! 以及因為某些原因導致的超過時間而沒有被執行的調度工作。
其實 anacron 也是每個小時被 crond 執行一次,然后 anacron 再去檢測相關的調度任務有沒有被執行,如果有超過期限的工作在, 就執行該調度任務,執行完畢或無須執行任何調度時,anacron 就停止了。
由于 anacron 默認會以一天、七天、一個月為期去偵測系統未進行的 crontab 任務,因此對于某些特殊的使用環境非常有幫助。 舉例來說,如果你的 Linux 主機是放在公司給同仁使用的,因為周末假日大家都不在所以也沒有必要打開, 因此你的 Linux 是周末都會關機兩天的。但是 crontab 大多在每天的凌晨以及周日的早上進行各項任務, 偏偏你又關機了,此時系統很多 crontab 的任務就無法進行。 anacron 剛好可以解決這個問題!
那么 anacron 又是怎么知道我們的系統啥時關機的呢?這就得要使用 anacron 讀取的時間記錄文件 (timestamps) 了! anacron 會去分析現在的時間與時間記錄文件所記載的上次執行 anacron 的時間,兩者比較后若發現有差異, 那就是在某些時刻沒有進行 crontab 啰!此時 anacron 就會開始執行未進行的 crontab 任務了!
### 15.4.2 anacron 與 /etc/anacrontab
anacron 其實是一支程序并非一個服務!這支程序在 CentOS 當中已經進入 crontab 的調度喔!同時 anacron 會每個小時被主動執行一次喔! 咦!每個小時?所以 anacron 的配置文件應該放置在 /etc/cron.hourly 嗎?嘿嘿!您真內行~趕緊來瞧一瞧:
```
[root@study ~]# cat /etc/cron.hourly/0anacron
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0;
fi
# 上面的語法在檢驗前一次執行 anacron 時的時間戳記!
# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power >/dev/null 2>&1
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s
# 所以其實也僅是執行 anacron -s 的指令!因此我們得來談談這支程序!
```
基本上, anacron 的語法如下:
```
[root@study ~]# anacron [-sfn] [job]..
[root@study ~]# anacron -u [job]..
選項與參數:
-s :開始一連續的執行各項工作 (job),會依據時間記錄文件的數據判斷是否進行;
-f :強制進行,而不去判斷時間記錄文件的時間戳記;
-n :立刻進行未進行的任務,而不延遲 (delay) 等待時間;
-u :僅更新時間記錄文件的時間戳記,不進行任何工作。
job :由 /etc/anacrontab 定義的各項工作名稱。
```
在我們的 CentOS 中,anacron 的進行其實是在每個小時都會被抓出來執行一次, 但是為了擔心 anacron 誤判時間參數,因此 /etc/cron.hourly/ 里面的 anacron 才會在文件名之前加個 0 (0anacron),讓 anacron 最先進行!就是為了讓時間戳記先更新!以避免 anacron 誤判 crontab 尚未進行任何工作的意思。
接下來我們看一下 anacron 的配置文件: /etc/anacrontab 的內容好了:
```
[root@study ~]# cat /etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45 # 隨機給予最大延遲時間,單位是分鐘
START_HOURS_RANGE=3-22 # 延遲多少個小時內應該要執行的任務時間
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
天數 延遲時間 工作名稱定義 實際要進行的指令串
# 天數單位為天;延遲時間單位為分鐘;工作名稱定義可自訂,指令串則通常與 crontab 的設置相同!
[root@study ~]# more /var/spool/anacron/*
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
20150731
::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
20150703
::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::
20150727
# 上面則是三個工作名稱的時間記錄文件以及記錄的時間戳記
```
我們拿 /etc/cron.daily/ 那一行的設置來說明好了。那四個字段的意義分別是:
* 天數:anacron 執行當下與時間戳記 (/var/spool/anacron/ 內的時間紀錄檔) 相差的天數,若超過此天數,就準備開始執行,若沒有超過此天數,則不予執行后續的指令。
* 延遲時間:若確定超過天數導致要執行調度工作了,那么請延遲執行的時間,因為擔心立即啟動會有其他資源沖突的問題吧!
* 工作名稱定義:這個沒啥意義,就只是會在 /var/log/cron 里頭記載該項任務的名稱這樣!通常與后續的目錄資源名稱相同即可。
* 實際要進行的指令串:有沒有跟 0hourly 很像啊!沒錯!相同的作法啊!通過 run-parts 來處理的!
根據上面的配置文件內容,我們大概知道 anacron 的執行流程應該是這樣的 (以 cron.daily 為例):
1. 由 /etc/anacrontab 分析到 cron.daily 這項工作名稱的天數為 1 天;
2. 由 /var/spool/anacron/cron.daily 取出最近一次執行 anacron 的時間戳記;
3. 由上個步驟與目前的時間比較,若差異天數為 1 天以上 (含 1 天),就準備進行指令;
4. 若準備進行指令,根據 /etc/anacrontab 的設置,將延遲 5 分鐘 + 3 小時 (看 START_HOURS_RANGE 的設置);
5. 延遲時間過后,開始執行后續指令,亦即“ run-parts /etc/cron.daily ”這串指令;
6. 執行完畢后, anacron 程序結束。
如此一來,放置在 /etc/cron.daily/ 內的任務就會在一天后一定會被執行的!因為 anacron 是每個小時被執行一次嘛! 所以,現在你知道為什么隔了一陣子才將 CentOS 開機,開機過后約 1 小時左右系統會有一小段時間的忙碌!而且硬盤會跑個不停!那就是因為 anacron 正在執行過去 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 里頭的未進行的各項工作調度啦!這樣對 anacron 有沒有概念了呢? ^_^
最后,我們來總結一下本章談到的許多配置文件與目錄的關系吧!這樣我們才能了解 crond 與 anacron 的關系:
1. crond 會主動去讀取 /etc/crontab, /var/spool/cron/*, /etc/cron.d/* 等配置文件,并依據“分、時、日、月、周”的時間設置去各項工作調度;
2. 根據 /etc/cron.d/0hourly 的設置,主動去 /etc/cron.hourly/ 目錄下,執行所有在該目錄下的可執行文件;
3. 因為 /etc/cron.hourly/0anacron 這個指令檔的緣故,主動的每小時執行 anacron ,并調用 /etc/anacrontab 的配置文件;
4. 根據 /etc/anacrontab 的設置,依據每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 內的可執行文件,以進行固定周期需要執行的指令。
也就是說,如果你每個周日的需要執行的動作是放置于 /etc/crontab 的話,那么該動作只要過期了就過期了,并不會被抓回來重新執行。但如果是放置在 /etc/cron.weekly/ 目錄下,那么該工作就會定期,幾乎一定會在一周內執行一次~如果你關機超過一周,那么一開機后的數個小時內,該工作就會主動的被執行喔! 真的嗎?對啦!因為 /etc/anacrontab 的定義啦!

**Tips** 基本上,crontab 與 at 都是“定時”去執行,過了時間就過了!不會重新來一遍~那 anacron 則是“定期”去執行,某一段周期的執行~ 因此,兩者可以并行,并不會互相沖突啦!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀