天天看點

『學了就忘』Linux系統定時任務 — 88、循環執行定時任務

目錄

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>服務預設都是啟動的。

『學了就忘』Linux系統定時任務 — 88、循環執行定時任務

<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>目錄中檢視上面這幾個目錄,如下圖所示:

『學了就忘』Linux系統定時任務 — 88、循環執行定時任務

我們可以看到<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>指令。