Linux任務調度(三)—anacron

本文是《Linux任務調度》的第三部分,說明Linux中可喚醒停機期間的任務調度的實現方法。

可喚醒停機期間的工作任務

如果你的 Linux 主機是作爲 24 小時全天、全年無休的服務器之用,那麼你只要有 atd 與 crond 這兩個服務來管理你的例行性工作排程即可。如果你的服務器並非 24 小時無間斷的啓動,那麼你該如何進行例行性工作? 舉例來說,如果你每天晚上都要關機,等到白天才啓動你的 Linux 主機時,由於 CentOS 默認的工作排程都在 4:02am 每天進行。如此一來不就一堆系統例行工作都沒有人在做了。此時就得要 anacron了。

什麼是 anacron

anacron 並不是用來取代 crontab 的,anacron在處理非 24 小時一直啓動的 Linux 系統的 crontab 的運行。所以 anacron 並不能指定何時運行某項任務, 而是以天爲單位或者是在啓動後立刻進行 anacron 的動作,他會去偵測停機期間應該進行但是並沒有進行的 crontab 任務,並將該任務運行一遍後,anacron 就會自動停止了。

 anacron 會以一天、七天、一個月爲期去偵測系統未進行的 crontab 任務,因此對於某些特殊的使用環境非常有幫助。 舉例來說,如果你的 Linux 主機是放在公司給同仁使用的,因爲週末假日大家都不在所以也沒有必要開啓, 因此你的 Linux 是週末都會關機兩天的。但是 crontab 大多在每天的凌晨以及週日的早上進行各項任務, 偏偏你又關機了,此時系統很多 crontab 的任務就無法進行。 anacron 剛好可以解決這個問題。

那麼 anacron 又是怎麼知道我們的系統啥時關機的呢?這就得要使用 anacron 讀取的時間記錄檔 (timestamps) 了。 anacron 會去分析現在的時間與時間記錄檔所記載的上次運行 anacron 的時間,兩者比較後若發現有差異, 那就是在某些時刻沒有進行 crontab 羅。此時 anacron 就會開始運行未進行的 crontab 任務了。 所以 anacron 其實也是透過crontab來運行的。因此 anacron運行的時間通常有兩個,一個是系統啓動期間運行,一個是寫入 crontab的排程中。 這樣才能夠在特定時間分析系統未進行的 crontab 工作。

anacron /etc/anacrontab

anacron 其實是一支程序並非一個服務。這支程序在 CentOS 當中已經進入 crontab 的排程。你可以這樣追蹤看看:

[root@www ~]# ll /etc/cron*/*ana*

-rwxr-xr-x 1 root root 379 Mar 28  2007 /etc/cron.daily/0anacron

-rwxr-xr-x 1 root root 381 Mar 28  2007 /etc/cron.monthly/0anacron

-rwxr-xr-x 1 root root 380 Mar 28  2007 /etc/cron.weekly/0anacron

剛好是每天、每週、每月有排程的工作目錄。查閱一下每天的任務

[root@www ~]# cat /etc/cron.daily/0anacron

if [ ! -e /var/run/anacron.pid ]; then

    anacron -u cron.daily

fi

所以其實也僅是運行 anacron -u的命令。因此我們得來談談這支程序。

基本上, anacron 的語法如下:

[root@www ~]# anacron [-sfn] [job]..

[root@www ~]# anacron -u [job]..

選項與參數:

-s  :開始一連續的運行各項工作 (job),會依據時間記錄檔的數據判斷是否進行;

-f  :強制進行,而不去判斷時間記錄檔的時間戳記;

-n  :立刻進行未進行的任務,而不延遲 (delay)等待時間;

-u  :僅升級時間記錄檔的時間戳記,不進行任何工作。

job :由 /etc/anacrontab定義的各項工作名稱。

所以我們發現其實/etc/cron.daily/0anacron僅進行時間戳記的升級,而沒有進行任何 anacron的動作。 anacron 的進行其實是在啓動完成後才進行的一項工作任務,你也可以將 anacron 排入 crontab 的排程中。但是爲了擔心 anacron 誤判時間參數,因此 /etc/cron.daily/ 裏面的 anacron 纔會在檔名之前加個 0 (0anacron),讓 anacron 最先進行。就是爲了讓時間戳記先升級。以避免 anacron 誤判 crontab 尚未進行任何工作的意思。

接下來我們看一下 /etc/anacrontab 的內容好了:

[root@www ~]# cat /etc/anacrontab

SHELL=/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

1       65      cron.daily     run-parts /etc/cron.daily

7       70      cron.weekly    run-parts /etc/cron.weekly

30      75      cron.monthly   run-parts /etc/cron.monthly

天數   延遲時間 工作名稱定義   實際要進行的命令串

天數單位爲天;延遲時間單位爲分鐘;工作名稱定義可自訂;

命令串則通常與 crontab的配置相同。

[root@www ~]# more /var/spool/anacron/*

::::::::::::::

/var/spool/anacron/cron.daily

::::::::::::::

20090315

::::::::::::::

/var/spool/anacron/cron.monthly

::::::::::::::

20090301

::::::::::::::

/var/spool/anacron/cron.weekly

::::::::::::::

20090315

上面則是三個工作名稱的時間記錄檔以及記錄的時間戳記

由於 /etc/cron.daily 內的任務比較多,因此我們使用每天進行的任務來解釋一下 anacron 的運行情況好了。 anacron 若下達『 anacron -scron.daily 』時,他會這樣運行的:

1.     /etc/anacrontab 分析到 cron.daily 這項工作名稱的天數爲 1 天;

2.     /var/spool/anacron/cron.daily 取出最近一次運行 anacron 的時間戳記;

3.     由上個步驟與目前的時間比較,若差異天數爲 1 天以上 ( 1 ),就準備進行命令;

4.     若準備進行命令,根據 /etc/anacrontab 的配置,將延遲 65 分鐘

5.     延遲時間過後,開始運行後續命令,亦即『 run-parts /etc/cron.daily 』這串命令;

6.     運行完畢後, anacron 程序結束。

所以說,時間戳記是非常重要的。anacron 是透過該記錄與目前的時間差異,瞭解到是否應該要進行某項任務的工作。 舉例來說,如果我的主機在 2009/03/15(星期天) 18:00 關機,然後在 2009/03/16(星期一) 8:00 啓動,由於我的 crontab 是在早上 04:00 左右進行各項任務,由於該時刻系統是關機的,因此時間戳記依舊爲 20090315 (舊的時間), 但是目前時間已經是 20090316 (新的時間),因此 run-parts/etc/cron.daily就會在啓動過 65 分鐘後開始運行了

所以anacron 並不需要額外的配置,使用默認值即可。只是我們的 CentOS 只有在啓動時纔會運行 anacron 就是了。如果要確定 anacron 是否啓動時會主動的運行,你可以下達下列命令:

[root@www ~]# chkconfig --list anacron

anacron      0:off   1:off   2:on    3:on    4:on    5:on    6:off

詳細的 chkconfig說明我們會在後續章節提到,注意看 3, 5

的項目,都是 on。那就是有啓動。啓動時纔會運行的意思。

現在你知道爲什麼隔了一陣子纔將 CentOS啓動,啓動過後約 1小時左右系統會有一小段時間的忙碌。而且硬盤會跑個不停。那就是因爲 anacron正在運行過去 crontab未進行的各項工作排程。


發佈了33 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章