1. 程式人生 > >Linux定時任務之crond/crontab

Linux定時任務之crond/crontab

定時任務,顧名思義即固定一段時間執行一次某任務。
例如手機設定的鬧鐘、定時開關機等都屬於定時任務,那麼Linux要如何設定定時任務呢?

crontab

首先認識crontab,該詞來源於希臘語chronos(χρόνος),原意是時間。
它是一個命令,常見於Unix和類Unix的作業系統之中,用於設定週期性被執行的指令。
該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。

crond

crond,與crontab是不可分割的,是crontab的守護程序。

守護程序(daemon)

它是一類在後臺執行的特殊程序,用於執行特定的系統任務。
很多守護程序在系統引導的時候啟動,並且一直執行直到系統關閉;另一些只在需要的時候才啟動,完成任務後就自動結束。

crontab file的格式
crontab檔案中的行由6個欄位組成,如下圖所示:

crontab檔案格式

其中各項格式如下:
1. 分鐘:0-59,表示分鐘數與給出值相等時執行任務
2. 小時:0-23,表示小時數與給出值相等時執行任務
3. 日期:1-31,含義同上
4. 月份:1-12,含義同上
5. 周幾:0-6,含義同上,其中數值為0時表示週日
6. 執行內容:即在shell命令列中能執行的命令

crontab file格式中的特殊符號
1. * ——星號,代表當前值為允許範圍內的所有值,如第一個欄位為*表示每一分鐘都執行任務,即每個都、全部的意思
2. - ——減號,代表一段區間,如第一個欄位為1-3表示1、2、3分鐘執行任務
3. ,——逗號,代表一些值的集合,如第一個欄位為1,2,4表示1、2、4分鐘執行任務
4. /n ——n代表數值,如第一個欄位為/3表示每3分鐘執行一次任務

crontab的幫助資訊
在命令列中敲入“crontab -h”命令檢視crontab的幫助資訊,如下:

Usage:
 crontab[options] file
 crontab[options]
 crontab -n [hostname]

Options:
 -u <user>   define user(確定使用者,如普通使用者、root)
 -e          edit user's crontab(編輯使用者的定時任務)
 -l          list user's crontab(檢視使用者的定時任務)
 -r          delete user's crontab(刪除使用者的定時任務)
-i prompt before deleting(刪除之前進行提示) -n <host> set host in cluster to run users' crontabs(在簇中設定執行使用者定時任務的主機,小編還沒完全搞懂見諒哈O(∩_∩)O,歡迎各位大神指導!) -c get host in cluster to run users' crontabs(獲取在簇中執行使用者定時任務的主機) -s selinux context -x <mask> enable debugging

本文介紹前五個較為常用的選項。
1. -l

-l選項預設情況下列印當前使用者的定時任務內容,通過下面的兩組操作即能證明。 如下圖:

普通使用者的定時任務內容
圖1 普通使用者的定時任務內容

當切換為超級使用者root後,結果如下:
超級使用者的定時任務內容
圖2 超級使用者的定時任務內容

如上,同樣的命令,在不同的使用者下結果顯然不同,故而-l命令預設情況下列印當前使用者的定時任務。

2.-u

那麼-l顯然不能滿足我們的需求,當需要檢視其它使用者的定時任務時,切換顯得尤為麻煩。此時-u的作用就體現出來了,話不多說直接上圖:

-u選項的應用
圖3 -u選項的應用

顯然,結果與圖1相同,即成功列印了使用者jing的定時任務。
那麼普通使用者是否可以檢視超級使用者的任務呢?顯然是不能的,也不應該能。
普通使用者嘗試訪問超級使用者的定時任務(失敗)
圖4 普通使用者嘗試訪問超級使用者的定時任務(失敗)

如上圖,系統打印出“必須擁有對-u指向使用者的特權”,即被該使用者允許才可讀取其定時任務。

3.-e

-e選項實現了當前使用者定時任務的編輯功能,預設使用vim編輯器,可以通過更改配置檔案進行更改。
假設,我們需要將當前時間列印在終端上,為了測試方便,所有時段均設為*值;將要執行的程式碼寫在檔案test.c中,內容如下:

要執行的程式碼
圖5 要執行的程式碼內容

生成可執行檔案後,其絕對路徑為/home/jing/Code/pts_study/test,將其結果重定向到終端8的螢幕上,程式碼如下:
定時任務程式碼
圖6 普通使用者定時任務程式碼

儲存退出後可看到如下提示,即為定時任務新增成功:
新增成功提示
圖7 新增成功提示

顯然,有時這種方法也不夠方便,還有一種新增定時任務的方法,是將命令寫入檔案,執行crontab file即可新增成功,新增如下:
寫入檔案中的命令
圖8 寫在檔案中的命令

上述任務表示每分鐘將當前date(日期)輸出重定向至7號終端,並將該date輸出重定向至指定路徑下的date.txt檔案。
之前我們已經在使用者jing中添加了一項定時任務(如圖6所示):每分鐘在8號終端上執行test檔案,其中test檔案將輸出當前終端的0、1、2號檔案描述符所指向的內容,即stdin、stdout和stderr;
現在再在超級使用者中新增上述任務檔案。
一段時間後分別觀察7、8號終端情況以及date.txt檔案內容如下:
8號終端輸出情況
圖9 8號終端輸出情況
7號終端輸出情況
圖10 7號終端輸出情況
檔案內容
圖11 date.txt檔案內容

4.-r

-r表示刪除定時任務,預設為當前使用者的。
如下圖所示,首先執行crontab -l命令,檢視當前使用者的定時任務,而後-r選項進行刪除,最終再次-l檢視,顯示“no crontab for jing”,即使用者jing已無定時任務,刪除成功!

刪除操作
圖12 定時任務的刪除

5.-i

-i表示在刪除任務之前進行提示,輸入y表示確認刪除,n表示取消,如下圖所示:

-i選項的使用方法
圖13 -i選項的使用方法