首頁 > linux教程 > Linux系統管理 閱讀:0更新時間:2020-03-28 01:05:21

Linux anacron命令用法詳解

anacron 是用來做什么的呢?設想這樣一個場景,linux 服務器會在周末關機兩天,但是設定的定時任務大多在周日早上進行,但在這個時間點,服務器又處于關機狀態,導致系統很多定時任務無法運行。

又比如,我們需要在凌晨 5 點 05 分執行系統的日志備份,但 Linux 服務器不是 24 小時開機的,在晚上需要關機,白天上班之后才會再次開機,在這個定時任務的執行時間我們的服務器剛好沒有開機,那么這個定時任務就不會執行了。anacron 就是用來解決這個問題的。

anacron 會以 1 天、1周(7天)、一個月作為檢測周期,判斷是否有定時任務在關機之后沒有執行。如果有這樣的任務,那么 anacron 會在特定的時間重新執行這些定時任務。

那么,anacron 是如何判斷這些定時任務已經超過執行時間的呢?這就需要借助 anacron 讀取的時間記錄文件。anacron 會分析現在的時間與時間記錄文件所記載的上次執行 anacron 的時間,將兩者進行比較,如果兩個時間的差值超過 anacron 的指定時間差值(一般是 1 天、7 天和一個月),就說明有定時任務沒有執行,這時 anacron 會介入并執行這個漏掉的定時任務,從而保證在關機時沒有執行的定時任務不會被漏掉。

在 CentOS 6.x 中,使用 cronie-anacron 軟件包取代了 vixie-cron 軟件包。而且在原先 CentOS 版本的 /etc/cron.{daily,weekly,monthly} 目錄中的定時任務會同時被 cron 和 anacron 調用,這樣非常容易出現重復執行同一個定時任務的錯誤。因此,在 CentOS 6.x 中,/etc/cron.{daily,weekly,monthly} 目錄中的定時任務只會被 anacron 調用,從而保證這些定時任務只會在每天、每周或每月定時執行一次,而不會重復執行。

不僅如此,在 CentOS 6.x 中,anacron 還有一個變化,那就是 anacron 不再是單獨的服務,而變成了系統命令。也就是說,我們不再使用“service anacron restart”命令來管理 anacron 服務了,而需要使用 anacron 命令來管理 anacron 工作。

anacron命令的基本格式如下:

[root@localhost ~]# anacron [選項] [工作名]

這里的工作名指的是依據 /etc/anacrontab 文件中定義的工作名。表 1 羅列出了此命令常用的幾個選項及各自的功能。

表 1 anacron命令常用選項及功能
選項 功能
-f 強制執行相關工作,忽略時間戳。
-u 更新 /var/spool/anacron/cron.{daily,weekly,monthly} 文件中的時間戳為當前日期,但不執行任何工作。
-s 依據 /etc/anacrontab 文件中設定的延遲時間順序執行工作,在前一個工作未完成前,不會開始下一個工作。
-n 立即執行 /etc/anacrontab 中所有的工作,忽略所有的延遲時間。
-q 禁止將信息輸出到標準錯誤,常和 -d 選項合用。

在當前的 Linux 中,其實不需要執行任何 anacron 命令,只需要配置好 /etc/anacrontab 文件,系統就會依賴這個文件中的設定來通過 anacron 執行定時任務了。那么,關鍵就是 /etc/anacrontab 文件的內容了。這個文件的內容如下:

[root@localhost ~]# vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
shell=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root
#前面的內容和/etc/crontab類似
#the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
#最大隨機廷遲
#the jobs will be started during the following hours only
START_H0URS_RANGE=3-22
#fanacron的執行時間范圍是3:00~22:00
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
#每天開機 5 分鐘后就檢查 /etc/cron.daily 目錄內的文件是否被執行,如果今天沒有被執行,那就執行
7 25 cron.weekly nice run-parts /etc/cron.weekly
#每隔 7 天開機后 25 分鐘檢查 /etc/cron.weekly 目錄內的文件是否被執行,如果一周內沒有被執行,就會執行
©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
#每隔一個月開機后 45 分鐘檢查 /etc/cron.monthly 目錄內的文件是否被執行,如果一個月內沒有被執行,那就執行 

在這個文件中,“RANDOM_DELAY”定義的是最大隨機延遲,也就是說,cron.daily 工作如果超過 1 天沒有執行,則并不會馬上執行,而是先延遲強制延遲時間,再延遲隨機延遲時間,之后再執行命令;“START_HOURS_RANGE”的是定義 anacron 執行時間范圍,anacron 只會在這個時間范圍內執行。

我們用 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 服務。不過,anacron 不用設置多余的配置,我們只需要把需要定時執行的腳本放入 /etc/cron.{daily,weekly,monthly} 目錄中,就會每天、每周或每月執行,而且也不再需要啟動 anacron 服務了。如果需要進行修改,則只需修改 /etc/anacrontab 配置文件即可。

比如,我更加習慣讓定時任務在凌晨 03:00-05:00 執行,就可以進行如下修改:

[root@localhost ~] # vi /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL-/bin/sh
PATH-/sbin:/bin:/usr/sbin:/usr/bin MAILTO-root
# the maximal random delay added to the base delay of the jobs RANDOM_DELAY=0
#把最大隨機廷遲改為0分鐘,不再隨機廷遲
# the jobs will be started during the following hours only START_HOORS_RANGE=3-5
#執行時間范圍為03:00—05:00
#period in days delay in minutes job-identifier command
1 0 cron.daily nice run-parts /etc/cron.daily
7 0 cron.weekly nice run-parts /etc/cron.weekly
@monthly 0 cron.monthly nice run-parts /etc/cron.monthly
#把強制延遲也改為0分鐘,不再強制廷遲

這樣,所有放入 /etc/cron.{daily,weekly,monthly} 目錄中的腳本都會在指定時間執行,而且也不怕服務器萬一關機的情況了。

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩