天天看點

『學了就忘』Linux系統定時任務 — 89、任務排程工具anacron

目錄

1、任務排程工具anacron介紹

2、新舊版本Linux中anacron工具的差別

3、/etc/cron.{daily,weekly,monthly}目錄說明

4、anacron指令

5、/etc/anacrontab的執行過程

在Linxu系統中,有三種用于任務排程的工具

<code>at</code>指令調用<code>atd</code>服務

<code>crontab</code>指令調用<code>cron(crond)</code>服務。

<code>anacron</code>工具。

(1)<code>anacron</code>工具是用來幹什麼的呢?

如果Linux伺服器不是24小時開機的,那麼剛好在關機的時間段之内有系統定時任務(<code>cron</code>)需要執行,那麼這些定時任務是不會執行的。

假設我們需要在淩晨3點03分執行系統的日志備份,但是我們的Linux伺服器不是24小時開機的,在晚上需要關機,白天上班之後才會再次開機。這個定時任務的執行時間,我們的伺服器剛好沒有開機,那麼這個任務就不會執行了,<code>anacron</code>工具就是用來解決這個問題的。

<code>anacron</code>工具會使用一天,七天,一個月作為檢測周期,用來判斷是否有定時任務在關機之後沒有被執行,如果有這樣的任務,<code>anacron</code>工具會在特定的時間重新執行這些定時任務。

<code>anacron</code>工具以天為機關,周期性地執行指令。<code>anacron</code>是以天為機關,而 <code>cron</code>最小執行的周期是分鐘。

(2)那麼<code>anacron</code>工具是如何判斷這些定時任務已經超過了執行時間的呢?

在系統的<code>/var/spool/anacron/</code>目錄中存在<code>cron.{daily,weekly,monthly}</code>檔案,這些檔案中都儲存着<code>anacron</code>工具上次執行時的時間。<code>anacron</code>工具會去讀取這些檔案中的時間,然後和目前時間做比較,若果兩個時間的內插補點超過了<code>anacron</code>工具配置檔案中的指定時間內插補點(一般是1天,7天和一個月)(<code>/etc/anacrontab</code>檔案),就說明有定時任務漏掉了沒有被執行,這時<code>anacron</code>工具會介入而執行這個漏掉的定時任務,進而保證在關機時沒有被執行的定時任務,不會被漏掉。

在原先的<code>CentOS 5.x</code>版中<code>/etc/cron.{daily,weekly,monthly}</code>這些目錄中的定時任務會同時被<code>cron</code>工具和<code>anacron</code>工具調用,這樣非常容易出現重複執行同一個定時任務的錯誤。

在<code>CentOS 6.x</code>中,我們使用<code>cronie-anacron</code>取代了<code>vixie-cron</code>軟體包。<code>/etc/cron.{daily,weekly,monthly}</code>目錄中的定時任務程式隻會被<code>anacron</code>工具調用,進而保證這些定時任務隻會在每天、每周或每月被定時執行一次,而不會重複執行。這也是我們在上一篇文章中介紹的<code>CentOS 6.x</code>的變化之一。

在<code>/etc</code>目錄下面有<code>crontab</code>的兩個檔案<code>crontab</code>和<code>cron.deny</code>,還有五個目錄<code>cron.d</code>、<code>cron.daily</code>、<code>cron.hourly</code>、<code>cron.monthly</code>、<code>cron.weekly</code>。

如下圖所示:

『學了就忘』Linux系統定時任務 — 89、任務排程工具anacron

說明:

<code>cron.deny</code>:檔案就是用于控制不讓哪些使用者使用<code>Crontab</code>的功能。

<code>crontab</code>:是設定定時任務執行檔案。

<code>cron.d</code>:是系統自動定期需要做的任務。

<code>cron.daily</code>:是每天執行一次的<code>job</code>。

<code>cron.hourly</code>:是每個小時執行一次的<code>job</code>。

<code>cron.monthly</code>:是每月執行一次的<code>job</code>。

<code>cron.weekly</code>:是每個星期執行一次的<code>job</code>。

在<code>CentOS 6.x</code>中<code>anacron</code>指令還有一個變化,<code>anacron</code>工具不再是單獨的服務,而變成了系統指令。也就是說我們不再可以使用<code>service anacron restart</code>指令來管理<code>anacron</code>服務了。而是需要使用<code>anacron</code>指令來管理<code>anacron</code>工具工作,具體指令如下:

在Linux 6版本中,其實不需要執行任何<code>anacron</code>指令,隻需要配置好<code>/etc/anacrontab</code>檔案,系統就會依賴這個檔案中的設定,來通過<code>anacron</code>工具執行定時任務。

那麼關鍵就是<code>/etc/anacrontab</code>檔案的内容了,這個檔案如下:

說明:在上面檔案中

<code>RANDOM_DELAY</code>定義的是最大随機延遲,也就是說<code>cron.daily</code>任務如果超過1天沒有執行,并不會馬上執行,而是先延遲強制延遲時間之後,再延遲随機延遲時間之後再執行指令。

<code>START_HOURS_RANGE</code>定義<code>anacron</code>的執行時間範圍,<code>anacron</code>隻會在這個時間範圍之内執行。

<code>period in days</code>執行周期;最小 1 天,也可以 3 天,5 天,一個星期(7 天)乃至一個月(月份不能确定有多少天,是以用<code>@monthly</code>代替)。

<code>delay in minutes</code>延遲多長時間執行,以分鐘為機關。為了避免多個任務在同一時間執行而造成伺服器繁忙,是以應該錯峰執行。

<code>job-identifier</code> 任務的唯一辨別。它用來建立檔案記錄任務執行的時間,通常建立在<code>/var/spool/anacron/</code>目錄中。

<code>command</code>真正執行的指令。

我們用上面配置檔案中的<code>cron.daily</code>工作來說明下<code>/etc/anacrontab</code>的執行過程:

首先讀取<code>/var/spool/anacron/cron.daily</code>中的上一次<code>anacron</code>執行的時間.

和目前時間比較,如果兩個時間的內插補點超過1天,就執行<code>cron.daily</code>工作。

執行這個工作隻能在<code>03:00-22:00</code>之間。

執行工作時強制延遲時間為5分鐘,再随機延遲<code>0-45</code>分鐘時間。

使用nice指令指定預設優先級,使用<code>run-parts</code>腳本執行<code>/etc/cron.daily</code>目錄中的所有可執行檔案。

大家發現了吧,<code>/etc/cron.{daily,weekly,monthly}</code>中的腳本,在目前的Linux中是被<code>anacron</code>調用的,不再依靠<code>cron</code>服務。(最重要的你要知道:無論在新舊版本的Linux系統中,<code>/etc/cron.{daily,weekly,monthly}</code>目錄中的腳本檔案,都是可以被正常執行的,關于是<code>cron</code>工具和<code>anacron</code>工具誰來調用的,你可以不用關心。)不過<code>anacron</code>不用設定多餘的配置,我們隻需要把需要定時執行的腳本放入<code>/etc/cron.{daily,weekly,monthly}</code>目錄當中,就會每天、每周或每月執行,而且也不再需要啟動<code>anacron</code>服務了,因為<code>anacron</code>指令是一個系統指令。