在Linxu系統中,有三種用於任務排程的工具
at
命令呼叫atd
服務crontab
命令呼叫cron(crond)
服務。anacron
工具。
1、任務排程工具anacron介紹
(1)anacron
工具是用來幹什麼的呢?
如果Linux伺服器不是24小時開機的,那麼剛好在關機的時間段之內有系統定時任務(cron
)需要執行,那麼這些定時任務是不會執行的。
假設我們需要在凌晨3點03分執行系統的日誌備份,但是我們的Linux伺服器不是24小時開機的,在晚上需要關機,白天上班之後才會再次開機。這個定時任務的執行時間,我們的伺服器剛好沒有開機,那麼這個任務就不會執行了,anacron
工具就是用來解決這個問題的。
anacron
工具會使用一天,七天,一個月作為檢測週期,用來判斷是否有定時任務在關機之後沒有被執行,如果有這樣的任務,anacron
工具會在特定的時間重新執行這些定時任務。
anacron
工具以天為單位,週期性地執行命令。anacron
是以天為單位,而 cron
最小執行的週期是分鐘。
(2)那麼anacron
工具是如何判斷這些定時任務已經超過了執行時間的呢?
在系統的/var/spool/anacron/
目錄中存在cron.{daily,weekly,monthly}
檔案,這些檔案中都儲存著anacron
工具上次執行時的時間。anacron
工具會去讀取這些檔案中的時間,然後和當前時間做比較,若果兩個時間的差值超過了anacron
工具配置檔案中的指定時間差值(一般是1天,7天和一個月)(/etc/anacrontab
檔案),就說明有定時任務漏掉了沒有被執行,這時anacron
工具會介入而執行這個漏掉的定時任務,從而保證在關機時沒有被執行的定時任務,不會被漏掉。
2、新舊版本Linux中anacron工具的區別
在原先的CentOS 5.x
版中/etc/cron.{daily,weekly,monthly}
這些目錄中的定時任務會同時被cron
工具和anacron
工具呼叫,這樣非常容易出現重複執行同一個定時任務的錯誤。
在CentOS 6.x
中,我們使用cronie-anacron
取代了vixie-cron
軟體包。/etc/cron.{daily,weekly,monthly}
目錄中的定時任務程式只會被anacron
工具呼叫,從而保證這些定時任務只會在每天、每週或每月被定時執行一次,而不會重複執行。這也是我們在上一篇文章中介紹的CentOS 6.x
的變化之一。
3、/etc/cron.{daily,weekly,monthly}目錄說明
在/etc
目錄下面有crontab
的兩個檔案crontab
和cron.deny
,還有五個目錄cron.d
、cron.daily
、cron.hourly
、cron.monthly
、cron.weekly
。
如下圖所示:
說明:
cron.deny
:檔案就是用於控制不讓哪些使用者使用Crontab
的功能。crontab
:是設定定時任務執行檔案。cron.d
:是系統自動定期需要做的任務。cron.daily
:是每天執行一次的job
。cron.hourly
:是每個小時執行一次的job
。cron.monthly
:是每月執行一次的job
。cron.weekly
:是每個星期執行一次的job
。
4、anacron命令
在CentOS 6.x
中anacron
命令還有一個變化,anacron
工具不再是單獨的服務,而變成了系統命令。也就是說我們不再可以使用service anacron restart
命令來管理anacron
服務了。而是需要使用anacron
命令來管理anacron
工具工作,具體命令如下:
[root@localhost ~]# anacron [選項] [工作名]
選項:
-s:開始anacron工作,依據/etc/anacrontab檔案中的設定的延遲時間執行。
-n:立即執行/etc/anacrontab中所有的工作,忽略所有的延遲時間。
-u:更新/var/spool/anacron/cron.{dai ly,weekly,monthly}檔案中的時間戳,但不執行任何工作
引數:
工作名:是依據/etc/anacrontab檔案中定義的工作名
在Linux 6版本中,其實不需要執行任何anacron
命令,只需要配置好/etc/anacrontab
檔案,系統就會依賴這個檔案中的設定,來通過anacron
工具執行定時任務。
那麼關鍵就是/etc/anacrontab
檔案的內容了,這個檔案如下:
# 在vim編輯器中開啟/etc/anacrontab檔案
[root@localhost ~]# vim /etc/anacrontab
# 下面是/etc/anacrontab檔案內容
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
# 前面的內容和/etc/crontab類似都是一些變數的設定
# 標識使用哪種shell
SHELL=/bin/sh
# 指定PATH環境變數,crontab是使用自己的PATH,
# 而不是用系統預設的,所以在定時任務中出現的命令最好使用絕對路徑。
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# 如果有報錯輸出,或命令結果有輸出,會向root發資訊
MAILTO=root
# the maximal random delay added to the base delay of the jobs
# 最大隨機延遲。
# 意思是:伺服器開機以後,會和`/var/spool/anacron/`目錄中檔案的內容對比時間
# 發現超過一天,那`/etc/cron.{daily,weekly,monthly}`這些目錄中的可執行檔案
# 就都會被執行,這麼多可執行指令碼不能同時執行,那樣伺服器的負載會非常大。
# 在開機45分鐘之內,給每個一指令碼隨機一個時間,一個一個來執行。
RANDOM_DELAY=45
# the jobs will be started during the following hours only
# 設定允許anacron的執行時間範圍是3:00-22:00
# 這個可以按照自己的需求修改。
START_HOURS_RANGE=3-22
# 下面就是我們的定時任務
# 意思是:時間差超過天數時,強制延遲多少分鐘之後,就執行命令
#天數 強制延遲(分) 工作名稱 實際執行的命令
#period in days delay in minutes job-identifier command
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
說明:在上面檔案中
RANDOM_DELAY
定義的是最大隨機延遲,也就是說cron.daily
任務如果超過1天沒有執行,並不會馬上執行,而是先延遲強制延遲時間之後,再延遲隨機延遲時間之後再執行命令。START_HOURS_RANGE
定義anacron
的執行時間範圍,anacron
只會在這個時間範圍之內執行。period in days
執行週期;最小 1 天,也可以 3 天,5 天,一個星期(7 天)乃至一個月(月份不能確定有多少天,所以用@monthly
代替)。delay in minutes
延遲多長時間執行,以分鐘為單位。為了避免多個任務在同一時間執行而造成伺服器繁忙,所以應該錯峰執行。job-identifier
任務的唯一標識。它用來建立檔案記錄任務執行的時間,通常建立在/var/spool/anacron/
目錄中。command
真正執行的命令。
5、/etc/anacrontab的執行過程
我們用上面配置檔案中的cron.daily
工作來說明下/etc/anacrontab
的執行過程:
- 首先讀取
/var/spool/anacron/cron.daily
中的上一次anacron
執行的時間. - 和當前時間比較,如果兩個時間的差值超過1天,就執行
cron.daily
工作。 - 執行這個工作只能在
03:00-22:00
之間。 - 執行工作時強制延遲時間為5分鐘,再隨機延遲
0-45
分鐘時間。 - 使用nice命令指定預設優先順序,使用
run-parts
指令碼執行/etc/cron.daily
目錄中的所有可執行檔案。
大家發現了吧,/etc/cron.{daily,weekly,monthly}
中的指令碼,在當前的Linux中是被anacron
呼叫的,不再依靠cron
服務。(最重要的你要知道:無論在新舊版本的Linux系統中,/etc/cron.{daily,weekly,monthly}
目錄中的指令碼檔案,都是可以被正常執行的,關於是cron
工具和anacron
工具誰來呼叫的,你可以不用關心。)不過anacron
不用設定多餘的配置,我們只需要把需要定時執行的指令碼放入/etc/cron.{daily,weekly,monthly}
目錄當中,就會每天、每週或每月執行,而且也不再需要啟動anacron
服務了,因為anacron
命令是一個系統命令。