(點選上方公眾號,可快速關註)
來源:暗無天日 ,
lujun9972.github.io/blog/2018/04/19/使用anacron定期執行任務/
anacron與cron的不同點
在網上可以可以看到很多文章都把anacron與cron來做比較,但實際上這兩者之間的差距還是蠻大的。
-
cron任務同透過常駐的守護行程crond來定期執行的。 而anacron則不是守護行程,它需要被別人定期掉起,比如跟cron或systemd timer配合
-
crond每分鐘檢查一次是否有需要執行的任務,若這次任務錯過了時間則需要等下次觸發點才能再次執行。 而anacron會立即執行錯過時間的任務,而正是由於這個特點,為了防止在不恰當的時刻執行命令,anacron專門有一個引數START_HOURS_RANGE來設定允許執行命令的時間段。
-
cron的粒度能精確到分鐘,而anacron的粒度只能到天(即執行頻率不能超過1天1次)
-
cron的執行時間是很精確的. 而anacron可以設定一個延遲時間(RANDOMDELAY),anacron會在這個延遲時間內的某一個隨機時間點執行。 這樣做的好處在於可以讓任務的執行時間分散,防止一瞬間對伺服器產生太大壓力。
-
cron有多個設定任務的地方(/var/spool/cron/使用者名稱, /etc/crontab, /etc/cron.d/*). 而anacron只有一個設定任務的地方(預設為 /etc/anacrontab, 也可以透過 -t 設定其他路徑的配置檔案)。
從上面可以看出,anacron其實並不是設計來定時執行任務的,它的主要功能還是為了緩解cron中一瞬間大量任務併發執行而導致系統壓力過大的問題。
/etc/anacrontab配置檔案說明
一個 /etc/anacrontab 內容大致如下:
cat /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=45
# the jobs will be started during the following hours only
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
看起來跟 cron 的配置檔案有點像。都是先定義環境變數,再定義執行計劃。
定義環境變數的部分跟cron一樣,只是這些環境變數中,有一些特殊變數值得說明一下:
RANDOME_DELAY=45
表示anacron在執行任務前先延時一段隨記的時間再執行,這段隨機的時間為0-45分鐘之內的隨機數。
START_HOURS_RANGE=3-22
指定了只有在凌晨3點到晚上22點這個時間段內才允許執行任務。
定義執行計劃部分就跟 cron 差別很大了。
執行計劃由四部分組成:
period in days
輪迴天數,表示任務多少天執行一次。
delay in minutes
表示啟動Anacron和執行作業時間之間的延遲,單位為分鐘. 當然前提是自最後一次執行之後所經過的時間超出了輪迴天數。 但是它並不是作業真正執行的時間,真正執行的時間還需要加上RANDOME_DELAY中設定的隨機分鐘數。
job-identifier
作業的識別符號。anacron在執行任務時會將日期寫入 /var/spool/anacron/$job-identifier 檔案中
command
實際執行的命令。這裡的 run-parts 是一個執行指定目錄中所有程式與指令碼的命令,可以透過 man run-parts 來檢視它的說明
anacron常用的選項
anacron的常用選項有下麵幾個:
-t 配置檔案路徑
讓anacron從指定配置檔案中讀取配置,常用於普通使用者來管理個人任務
-S spooldir
設定新的spool目錄來記錄任務執行的時間戳,常用於普通使用者來管理個人任務
-T
測試配置檔案是否正確
-f
強制執行所有的任務,而不管之前的執行日期是否超過輪迴天數
-u
將所有任務的執行日期都更新為當前日期,而不真正的執行任務
-s
序列地執行任務,只有前一個任務完成後才開始下一個任務
看完本文有收穫?請轉發分享給更多人
關註「ImportNew」,提升Java技能