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

繁華似錦Fighting發表於2021-12-22

在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的兩個檔案crontabcron.deny,還有五個目錄cron.dcron.dailycron.hourlycron.monthlycron.weekly

如下圖所示:

image

說明:

  • cron.deny:檔案就是用於控制不讓哪些使用者使用Crontab的功能。
  • crontab:是設定定時任務執行檔案。
  • cron.d:是系統自動定期需要做的任務。
  • cron.daily:是每天執行一次的job
  • cron.hourly:是每個小時執行一次的job
  • cron.monthly:是每月執行一次的job
  • cron.weekly:是每個星期執行一次的job

4、anacron命令

CentOS 6.xanacron命令還有一個變化,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的執行過程:

  1. 首先讀取/var/spool/anacron/cron.daily中的上一次anacron執行的時間.
  2. 和當前時間比較,如果兩個時間的差值超過1天,就執行cron.daily工作。
  3. 執行這個工作只能在03:00-22:00之間。
  4. 執行工作時強制延遲時間為5分鐘,再隨機延遲0-45分鐘時間。
  5. 使用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命令是一個系統命令。

相關文章