目錄
1、crond服務管理與通路控制
2、crontab指令的通路控制
3、使用者級别的crontab指令
4、crontab指令的注意事項
5、系統的crontab設定
(1)/etc/crontab配置檔案說明
(2)通過配置檔案的方式設定定時任務
需使用<code>crontab</code>指令。
<code>crontab</code>指令可以循環執行定時任務。比如每天的淩晨2點都執行一次某個任務。
<code>cron</code>服務是Linux系統自帶的守護程序(<code>daemon</code>),用來重複運作某些被設定好了确定的運作時間的任務,這些任務可以是每個月運作、每周運作、每天運作,甚至是每一分鐘運作。
在Linxu系統中,有三種用于任務排程的工具
<code>at</code>指令調用<code>atd</code>服務。
<code>crontab</code>指令調用<code>cron(crond)</code>服務。
<code>anacron</code>工具。
<code>crontab</code>指令是需要<code>crond</code>服務支援的,<code>crond</code>服務同樣是獨立的服務,是以啟動和自啟動方法如下:
提示:隻要你的Linux系統是安裝的,哪怕是最小化安裝,<code>at</code>服務和<code>cron</code>服務預設都是啟動的。

<code>crond</code>服務預設是自啟動的,如果伺服器上有循環執行的系統定時任務,就不要關閉<code>crond</code>服務了。
<code>crontab</code>指令和<code>at</code>指令類似,也是通過<code>/etc/cron.allow</code>和<code>/etc/cron.deny</code>檔案來限制某些使用者是否可以使用crontab指令的,而且原則也非常相似:
當系統中有<code>/etc/cron.allow</code>檔案時,隻有寫入此檔案的使用者可以使用<code>crontab</code>指令,沒有寫入的使用者不能使用<code>crontab</code>指令。同樣如果有此檔案,<code>/etc/cron.deny</code>檔案會被忽略,<code>/etc/cron.allow</code>檔案的優先級更高。
當系統中隻有<code>/etc/cron.deny</code>檔案時,則寫入此檔案的使用者不能使用<code>crontab</code>指令,沒有寫入檔案的使用者可以使用<code>crontab</code>指令。
<code>crontab</code>指令規則基本和<code>at</code>指令的規則一直,同樣<code>/etc/cron.allow</code>檔案的優先級比/<code>etc/cron.deny</code>檔案的優先級高,Linux 中預設隻有<code>/etc/cron.deny</code>檔案。
(1)crontab指令介紹
<code>cron</code>服務提供<code>crontab</code>指令來設定<code>cron</code>服務的,
也就是使用<code>crontab</code>指令的方式實作<code>cron</code>定時任務。
每個使用者都可以實作自己的<code>crontab</code>定時任務,隻要是使用使用者身份執行<code>crontab -e</code>指令即可,當然這個使用者不能加入<code>/etc/cron.deny</code>檔案中。
也就是說這種方式隻能是,哪個使用者定義的<code>crontab</code>定時任務,就由哪個使用者來執行。
<code>crontab</code>指令格式如下:
示例:
提示: 任務可以是單一的執行指令,單一的指令所能完成的工作是比較少的,一般在工作中都是使用執行腳本。
内容含義說明:
項目
含義
範圍
第一個”*“
一小時當中的第幾分鐘
0-59
第二個”*“
一天當中的第幾小時
0-23
第三個”*“
一個月當中的第幾天
1-31
第四個”*“
一年當中的第幾月
1-12
第五個”*“
一周當中的星期幾
0-7(0和7都代表星期日)
時間的表達式中,還有一些特殊符号:
特殊符号
<code>*</code>
代表任何時間。比如第一個“*”就代表一小時中每分鐘都執行一次的意思。
<code>,</code>
代表不連續的時間。比如<code>0 8,12,16 * * * 所要執行的指令</code>,就代表在每天的8點0分,12點0分,16點0分都執行一次指令。
<code>-</code>
代表連續的時間範圍。比如<code>0 5 * * 1-6 所要執行的指令</code>,代表在周一到周六的淩晨5點0分執行指令。
<code>*/10</code>
代表每隔多久執行一次。比如<code>*/10 * * * * 所要執行的指令</code>,代表每隔10分鐘就執行一遍指令。
時間表達式示例:
時間
<code>10 * * * * 所要執行的指令</code>
每小時的第10分鐘執行一次指令
<code>45 22 * * * 所要執行的指令</code>
在22點45分執行指令
<code>0 17 * * 1 所要執行的指令</code>
每周1的17點0分執行指令
<code>0 5 1,15 * * 所要執行的指令</code>
每月1日和15日的淩晨5點0分執行指令
<code>40 4 * * 1-5 所要執行的指令</code>
每周一到周五的淩晨4點40分執行指令
<code>*/10 4 * * * 所要執行的指令</code>
每天的淩晨4點,每隔10分鐘執行一次指令
<code>0 0 1,15 * 1 所要執行的指令</code>
每月1日和15日,每周1的0點0分都會執行指令。
日和星期不是并且的關系,是或者的關系。
注意:星期幾和幾号最好不要同時出現,因為他們定義的都是天,非常容易讓管理者混亂。
在舉一個特例:
<code>0 6 31 * * 所要執行的指令</code>,不一定每個月都有31日,在沒有31日的月份就不執行。在做定時任務的時候,最後不要選這麼極端的時間。
<code>crontab</code>指令定時任務示例:
讓系統每隔1分鐘,就向<code>/tmp/test</code>檔案中寫入一行“12345”,驗證一下系統定時任務是否會執行。
系統在每周二的淩晨5點05分重新開機一次
提示:不建議用定時任務執行伺服器重新開機,有可能出現伺服器沒有重新啟動的情況。伺服器的重新開機操作最好還是需要管理者參與。
在每月的1号,10号,15号的淩晨3點30分都定時執行日志備份腳本<code>autobak.sh</code>。
這個操作常用。
(2)檢視crontab任務
檢視<code>root</code>使用者的<code>crontab</code>任務。
(3)删除crontab任務
删除root使用者所有的定時任務。
提示:如果隻想删除某一個定時任務,需要進入<code>crontab -e</code>編輯模式手工删除。
在書寫<code>crontab</code>定時任務時,需要注意幾個注意事項,這裡我們再強調下:
六個選項都不能為空,必須填寫,如果不确定使用<code>*</code>代表任意時間。
<code>crontab</code>定時任務,最小有效時間是分鐘,最大有效時間是月。像2020年某時執行,3點30分30秒這樣的時間都不能識别。
在定義時間時,日期和星期最好不要在一條定時任務中出現,因為它們都是以天作為機關,非常容易讓管理者混亂。
在定時任務中,不管是直接寫指令,還是在腳本中寫指令,最好都是用絕對路徑。有時相對路徑的指令會報錯。
<code>crontab -e</code>是每個使用者執行的指令,也就是說不同的使用者身份可以執行自己的定時任務。可是有些定時任務需要系統執行,這時我們就需要編輯<code>/etc/crontab</code>這個配置檔案了。
并不是說寫入<code>/etc/crontab</code>配置檔案中的定時任務執行時,不需要使用者身份,而是<code>crontab -e</code>指令定義定時任務時,預設使用者身份是目前登入使用者。而修改<code>/etc/crontab</code>配置檔案時,定時任務的執行者的身份,是可以手工指定的。
這樣定時任務的執行會更加靈活,修改起來也更加友善。
我們來檢視一下<code>/etc/crontab</code>配置檔案:
在<code>CentOS 5.x</code>中<code>/etc/crontab</code>檔案的内容大概是這個樣子:
說明:
在<code>CentOS 5.x</code>版本中,<code>/etc/crontab</code>檔案會使用<code>run-parts</code>腳本執行<code>/etc/cron.{daily,weekly,monthly}</code>目錄中的所有檔案。這個<code>run-parts</code>其實是一個shell腳本,儲存在<code>/usr/bin/run-parts</code>,它的作用就是把其後面跟随的目錄中的所有可執行檔案依次執行。
(意思是說在<code>daily,weekly,monthly</code>這些目錄裡存放腳本,并按賦予<code>run-parts</code>腳本的定時時間來執行目錄中的所有腳本)
(在<code>CentOS 6.x</code>版本中也存在)
以<code>02 4 * * * root run-parts /etc/cron.daily</code>為例:
如果我們想讓某個腳本在每天都執行一次,可以不用手工去寫定時任務,而隻需要給<code>run-parts</code>腳本賦予執行權限,并把它放入<code>/etc/cron.daily/</code>目錄中,這樣這個腳本就會在每天的淩晨4點02分執行了。
我們在來看看<code>/etc/cron.{daily,weekly,monthly}</code>目錄
進入到<code>etc</code>目錄中檢視上面這幾個目錄,如下圖所示:
我們可以看到<code>daily,weekly,monthly</code>是三個目錄,裡邊存放着一些可執行腳本。
這裡我們就明白了,當按照定時表達式執行一個<code>run-parts</code>腳本的時候,<code>run-parts</code>腳本會把跟在他後邊的目錄中的腳本都執行一次,進而完成定時任務。
在<code>CentOS 6.x</code>版本中<code>crontab</code>指令是如何執行定時任務的呢?
我們看到<code>/etc/crontab</code>中有一句提示,讓我們<code>man 4 crontabs</code>來檢視幫助。在這個幫助中,明确寫明了“在舊版本的<code>crontab</code>配置檔案中,是通過<code>run-parts</code>腳本來調用<code>/etc/cron.{daily,weekly,monthly}</code>目錄中的腳本檔案,定時執行這些目錄中的腳本。在目前系統中,為了避免<code>cron</code>和<code>anacron</code>之間産生沖突,隻要<code>anacron</code>已經安裝,就使用<code>anacron</code>來執行這些目錄中的腳本。”
對于<code>anacron</code>工具的用法,我們下一篇文章來介紹。
其實對我們使用者來講,并不需要知道這個定時任務到底是由哪個程式調用的。我們需要知道的事情是如何使用系統的<code>crontab</code>設定。
這個新老版本的CentOS沒有差別,配置方法都有兩種:
1)方式一
第一種方法就是上面說過的,把你需要定時執行的工作寫成腳本程式,并賦予執行權限,然後直接把這個腳本複制到<code>/etc/cron.{daily,weekly,monthly}</code>目錄中的任意一個。比如我需要讓某個腳本每周執行,那麼就把這個腳本複制到<code>/etc/cron.weekly/</code>目錄中。這樣這個腳本就會每周執行一次,具體的執行時間要參考<code>anacron</code>的配置。
2)方式二
第二種方法就是修改<code>/etc/crontab</code>這個配置檔案,自己加入自己的定時任務,不過需要注意指定腳本的執行者身份。
例如:
隻要儲存<code>/etc/crontab</code>檔案,這個定時任務就可以執行了,當然要确定<code>crond</code>服務是運作的。
這兩種方法都是可以使用的,具體看個人的習慣吧!不過要想修改<code>/etc/crontab</code>檔案,當然我要是<code>root</code>使用者才可以,普通不能修改,隻能使用使用者身份的<code>crontab</code>指令。