人類把時間作了切割,想象一條筆直的線永遠向前,原本這條直線上什麼都沒有,可是人類根據時間的長短(單位)在這條直線上作了密密麻麻的標記(世紀-年-月-日-時-分-秒-豪秒......),經過這樣的方式歷史上的每個時刻都可以被單獨拿出來,而將來的每個時刻也能被單獨計劃。更重要的是,每個單獨的時刻又能跟相鄰的被更大單位所控制的類似時刻作比較,好比,今天的晚上12點跟明天的晚上12點,類似的是,兩個時刻都是12點,不一樣的是今天跟明天,她們是相鄰的更大單位。由於這樣的緣故,在被更大單位所隔開的每個相同時刻,咱們能夠告訴計算機重複某個任務。linux
在linux下,若是想要在將來的某個時刻執行某個任務,而且在將來的每個這樣的時刻裏都要執行這個任務,舉個簡單的例子,好比說想要在未來,天天的十二點都重啓路由器,大多數發行版都自帶一個守護進程(daemon)cron來完成這項工做。git
cron是大多數linux發行版都自帶的守護進程(daemon),用來重複運行某些被設定好了肯定的運行時間的任務,這些任務能夠是每月運行、每週運行、天天運行,甚至是每一分鐘運行。用cron執行的任務適合於24小時運行的機器,cron執行的任務會在設定好的時刻執行,當機器處於關機狀態下並錯過了任務執行的時間,cron任務就沒法預期執行了。github
crontab(cron table的簡稱)既能夠指cron用來按期執行特定任務所須要的列表文件,又能夠指用來建立、刪除、查看當前用戶(或者指定用戶)的crontab文件的命令。shell
anacron不是守護進程,能夠看作是cron守護進程的某種補充程序,anacron是獨立的linux程序,被cron守護進程或者其餘開機腳本啓動運行,能夠天天、每週、每月週期性地執行一項任務(最小單位爲天)。適合於可能常常會關機的機器,當機器從新開機anacron程序啓動以後,anacron會檢查anacron任務是否在合適的週期執行了,若是未執行則在anacron設定好的延遲時間以後只執行一次任務,而無論任務錯過了幾回週期。舉個例子,好比你設定了一個每週備份文件的任務,可是你的電腦由於你外出度假而處於關機狀態四周,當你回到家中開機後,anacron會在延遲必定時間以後只備份一次文件。因爲發行版的不一樣,cron守護進程如何運行anacron會有所不一樣。vim
系統默認crontab文件爲/etc/crontab,以及/etc/cron.d/目錄下的文件,有些程序會把本身的crontab文件放在/etc/cron.d/目錄下。要修改/etc/crontab以及/etc/cron.d/目錄下的文件須要root權限。cron守護進程會檢查/etc/crontab以及/etc/cron.d/目錄下的文件,根據這些文件中的cron任務所設置的執行時間決定是否執行任務,若是當前時間與cron任務所設置的執行時間相同,則執行任務。centos
每一個用戶本身的crontab文件都會被放在 /var/spool/cron目錄下,默認爲空,可使用crontab命令建立。cron守護進程會檢查/var/spool/cron目錄下的文件,根據這些文件中的cron任務所設置的執行時間決定是否執行任務,若是當前時間與cron任務所設置的執行時間相同,則執行任務。bash
當cron的配置文件發生改變時,不須要重置cron守護進程。cron守護進程會檢查配置文件的變化。dom
建立本身的crontab以前,首先要設置環境變量EDITOR,cron進程根據它來肯定使用哪一個編輯器編輯crontab文件。在home目錄下的.bashrc或者.profile里加入一行編輯器
#你也可使用本身喜好的其餘終端編輯器
EDITOR=vim; export EDITOR
複製代碼
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
-e (edit user's crontab) -l (list user's crontab)
-r (delete user's crontab) -i (prompt before deleting user's crontab)
複製代碼
建立並編輯當前用戶的crontabide
crontab -e
複製代碼
列出當前用戶的crontab
crontab -l
複製代碼
刪除用戶linus的crontab
crontab -u linus -i -r
複製代碼
當用crontab -e
編輯當前用戶的crontab文件時,首先寫入如下內容。
# crontab -e
SHELL=/bin/bash
MAILTO=root@example.com
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
複製代碼
該文件的前三行代碼設置了默認環境。cron守護進程並不提供任何環境。SHELL變量設置當cron任務(命令以及腳本)運行時的shell,MAILTO變量設置cron任務執行結果發送的郵箱,PATH設置去哪些目錄下尋找cron任務的命令。註釋部分則解釋一條cron任務的構成,一條cron任務就是一行,要設置多少條cron任務則寫多少行。一條cron任務由七個部分組成,從左到右依次爲:
前五個部分的編寫注意特殊符號的含義:
例子1: 天天凌晨執行
0 0 * * * root command
複製代碼
例子2: 每週星期天早上五點執行
0 5 * * sun root command
複製代碼
例子3: 每月的前10天晚上10點開始每隔10分鐘執行一次命令
*/10 22 1-10 * * root command
複製代碼
例子4: 從星期一到五,每一個小時的第10分鐘、第20分鐘以及第30分鐘都執行一次命令
10,20,30 * * * 1-5 root command
複製代碼
例子5: 從早上10點到晚上10點,每一個偶數的小時(好比10點,12點)裏每五分鐘運行一次命令
*/5 10-22/2 * * * root command
複製代碼
特殊簡便寫法:
@hourly 表明0 * * * *
,每一個小時運行一次
@daily 表明0 0 * * *
,天天凌晨運行一次
@weekly 表明0 0 * * 0
,每週星期天凌晨運行一次
@monthly 表明0 0 1 * *
,每月第一天凌晨運行一次
@yearly 表明0 0 1 1 *
,每一年的頭一分鐘運行一次
@reboot 重啓後執行一次
例子: 天天凌晨運行一次 @daily command
你能夠把須要每一個小時運行一次的腳本放到/etc/cron.hourly目錄下,cron守護進程會每一個小時都運行一次。
在/etc/目錄下,可能默認會有cron.allow以及cron.deny文件,也可能沒有,沒有的狀況下能夠本身建立,cron.allow文件包含了可使用cron的用戶名,cron.deny文件包含了不可使用cron的用戶名。兩個文件中每一個用戶名佔一行,而且不容許出現空格。 root用戶在任何狀況下均可以使用cron。 假如cron.allow存在,則只有列在這個文件中的用戶名可使用cron,這時候cron.deny被忽視。 假如cron.allow不存在,則列在cron.deny文件中的用戶名不可使用cron。
anacron程序能夠週期性的執行任務,但具體執行時間並不肯定。能夠天天、每週、每月週期性的執行任務。當anacron的配置文件發生改變時,下一次anacron運行時會檢查到配置文件的變化。anacron的配置文件爲/etc/anacrontab,編輯須要root權限,默認如下內容:
# 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
複製代碼
能夠看到前三行設置了默認環境,RANDOM_DELAY變量設置了最大延遲執行時間,START_HOURS_RANGE變量設置了anacron任務執行的時間範圍,默認在天天的3點到22點之間。最後三行則設置了三條默認的anacron任務,分別是天天執行,每週執行,每個月執行。
觀察前面三條默認的anacron任務,能夠看到一條anacron任務分爲四個部分,從左到右依次爲:
@daily
表明天天,@weekly
表明每週,@monthly
表明每個月。在/etc/anacrontab中的三條默認anacron任務中,nice命令用來調整後面命令的優先級,run-parts命令用來執行設置的目錄下的全部腳本,就是說這三條任務分別天天,每週,每個月執行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目錄下的腳本。因此咱們不用本身往/etc/anacrontab中添加anacrontab任務,而只需把腳本放到相應的目錄下,anacron就會週期性的執行這些腳本了。
既然anacron不是守護進程,那它是如何作到週期性執行任務的呢?在centos7下,cron會運行/etc/cron.d/0hourly,在/etc/cron.d/0hourly文件裏,有一條cron任務是這樣的: 01 * * * * root run-parts /etc/cron.hourly
這條cron任務會運行/etc/cron.hourly目錄下的全部腳本,其中有一個名爲0anacron
的腳本,該腳本則會在合適的時間運行anacron,anacron則會檢查/etc/anacrontab,在合適的時間分別運行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目錄下的腳本。
參考資料:
How to Schedule Job on Linux using Cron, Anacron and at Commands
歡迎瀏覽個人我的博客,https://diwugebingren.github.io